Изменение Timage при нажатии на Tbutton

  • Автор темы masterdelphi
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

masterdelphi

#1
Кто может помочь!!Надо сделать такую процедуру или функцию!У меня на форме три кнопки Button и три Image,надо чтобы при нажатии на Button1 рисование происходило в Image1,при нажатии на Button2 рисование происходило в Image2 и т.д.,на каждом image цикл рисования одинаков, важна только реакция на конкретный Button!!Проблема в том что у меня 20 фигур для прорисовки и если для них писать по три процедуры рисования (для каждого Image) то получится 60 процедур, я хочу чтобы при нажатии на Button1,Button2,button3 загружалась одна и та же процедура(для одной фигуры) прорисовки но с разным Image(1,2,3-соответственно).
Поясняю:
Обязательно надо с Button'ами и Image'ами.
вот прога:

procedure ...
var...
begin...
и тут самое главное
with Image1.canvas do
begin
само рисование
end;
end;
надо чтобы вместо Image1 стояла переменная ,которой при выполнении процедуры:
procedure TForm1.Button1Click(Sender: TObject);присваивалось бы значение компонента Image1
procedure TForm1.Button2Click(Sender: TObject);-Image2
procedure TForm1.Button3Click(Sender: TObject);-Image3.
Где-то слышал что это делается в отдельной процедуре через вот эту вещь Sender: TObject.
Обязательно надо с Button'ами и Image'ами
 
B

Barmutik

#2
По нажатию на кнопку запоминайте в какой конкретно TImage Вы хотите рисовать.. а впроцедуре рисования обращайтесь к запомненному объекту ...
 
?

????

#3
Для: masterdelphi
можно что-то типа
Код:
procedure TForm1.ButtonClick(Sender: TObject);
begin
with Sender as TButton do
begin
with TImage(FindComponent('Image' + IntToStr(Tag))) do
begin
Вот тут мы будем обращаться к нужному canvas
end;
end;
end;
Принцип таков: в свойстве Tag кнопок записываем номер картинки на которой надо рисовать. На все кнопки вешаем этот обработчик (он должен быть один). В обработчике получаем значение Tag нажатой кнопки и ищем компонент 'Image' + IntToStr(Tag), т.е. если Tag = 1, то Image1 и т.д. Главное правильно присвоить значения Tag и назвать компоненты Image.
 
M

masterdelphi

#4
Кто знает как сделать так чтобы при движении(нажатии, перемещении, отпускании) курсора мыши его координаты считывались не с формы а с Image!!!
Поясню:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//координаты X и Y в этой процедуре это координаты на форме а мне надо на моем Image
end;
надо именно в этой процедуре!!!
 
?

????

#5
<!--QuoteBegin-masterdelphi+24:05:2006, 08:10 -->
<span class="vbquote">(masterdelphi @ 24:05:2006, 08:10 )</span><!--QuoteEBegin-->а с Image!!!
[snapback]36554" rel="nofollow" target="_blank[/snapback]​
[/quote]
Простая математика :( с значениями Top Left Height Width формы и Image или ParentToClient()
 
?

????

#7
<!--QuoteBegin-masterdelphi+24:05:2006, 07:26 -->
<span class="vbquote">(masterdelphi @ 24:05:2006, 07:26 )</span><!--QuoteEBegin-->Т.е. поясни пожалуйста?
[snapback]36556" rel="nofollow" target="_blank[/snapback]​
[/quote]
Translate parent coordinates to client coordinates.

Delphi syntax:

function ParentToClient(const Point: TPoint; AParent: TWinControl = nil): TPoint;

Description

ParentToClient translates Point from the AParent’s coordinate system to the current control’s coordinate system. AParent must be a control that can be found by iterating up the chain of Parent properties. If AParent is nil (Delphi) or NULL (C++), the control’s immediate parent is used.

pt_form.X := X;
pt_form.Y := Y;

pt_image := Image.ParentToClient(pt_form, Form1);

теперь в pt_image.X - координаты относительно Image а не Form
 
M

masterdelphi

#8
Ситуация такая я должен по Image перемещать треугольник с помощью мыши. Для этого мне и нужны координаты на Image(чтобы определить попадает курсор в треугольник или нет)!!!


Ситуация такая я должен по Image перемещать треугольник с помощью мыши. Для этого мне и нужны координаты на Image(чтобы определить попадает курсор в треугольник или нет)!!!
 
B

Barmutik

#9
Ну так и в чём проблема ? Вам же указали способ для определения координат мыши ?
 
M

masterdelphi

#10
спасибо!!!Теперь проблем нету!!
скажите как мне поставить условие для попадания курсора на фигуру(которую сам нарисовал в Image)?
 
M

masterdelphi

#11
Очень важный вопрос:
У меня есть n-угольник нарисованный в image, для каждого пикселя n-угольника надо расчитать интенсивность освещения и выполнить закраску по алгоритму Гуро(если кто знает).n-угольник задается матрицей nx4.Где первые три столбца это x,y,z четвертый-нормировочный.
формулу для интенсивности я знаю в неё входят три переменных зависящих от координат конкретного пикселя.
Вопрос: как пробежаться по всем пикселям n-угольника вычислив для каждого пикселя и задав ему свою интенсивность ну скажем в макросе RGB(0,I,0), где I интенсивность конкретного пикселя?
 
M

masterdelphi

#12
Вообщем-то весь вопрос заключается в том чтобы взяв какой-то многоугольник поочерёдно вынимать из него координаты пикселей ему принадлежащих, проводить с ними математические операции, и присваивать пикселю с этими координатами определенное значение в макросе RGB(0,I,0)!!!!!!!!


Вообщем-то весь вопрос заключается в том чтобы взяв какой-то многоугольник поочерёдно вынимать из него координаты пикселей ему принадлежащих, проводить с ними математические операции, и присваивать пикселю с этими координатами определенное значение в макросе RGB(0,I,0)!!!!!!!!
 
B

Barmutik

#13
Ну так ... бежите по вашей картинке по пиксельно (очень медленно но пойдёт).. смотрте попадает она в маш Н-угольник или нет (с определеним попадания точки в выпуклый многоугльник алгоритмов куча).. ну и далее применяете свой алгоритм освещения ..

В чём проблемы ?
 
R

Razoomnick

#14
Я бы сказал, что проблема скорее в определении принаднежности точки фигуре, заданой массивом координат.

последовательно суммируешь все углы из твоей точки до каждой вершины (т.е., если назвать твою точку 0, угол 1-0-2, 2-0-3 ... n-0-1), учитывая знак (скажем, против часовой - плюс, по - минус). Если точка внутри фигуры, сумма углов будет 2пи, иначе 0.
 
M

masterdelphi

#15
Проблема в самом алгоритме освещения надо проходить его в определенном порядке(алгоритм Гуро-интерполяция интенсивностей):
координаты освещаемого в данный момент пикселя это не координаты на самом Image т.е. я хочу сказать что у меня есть n-угольник в трёхмерном пространстве, для каждого пикселя(в смысле точки) этого многоугольника надо расчитать интенсивность используя его реальные координаты,далее это массив интенсивностей надо сохранить , выполнить операцию проецирования на Image и присвоить ранее расчитанные интенсивности уже спроецированным пикселям.
 
?
#16
Для: masterdelphi
<!--QuoteBegin-masterdelphi+25:05:2006, 14:26 -->
<span class="vbquote">(masterdelphi @ 25:05:2006, 14:26 )</span><!--QuoteEBegin-->Проблема в самом алгоритме освещения
[snapback]36658" rel="nofollow" target="_blank[/snapback]​
[/quote]
в алгоритме проблемы нет - она может быть в реализации (или непонимании алгоритма). Реализации (даже намёка) я не вижу, значит проблемы в понимании алгоритма, а к Delphi это не имеет никакого отношения.

не знаю есть ли у тебя литература, но это может пригодиться
_http://www.enlight.ru:8002/faq3d/content.htm
 
M

masterdelphi

#17
Вся загвостка в том что я нашёл несколько вариантов программной реализации и не один из них не могу понять т.к там очень сложный синтаксис.Такое ощущение ,что его писали злостные программеры,а читая теорию я не нахожу ничего сложного в интерполяции мне просто не догнать как это сделать в delphi.

Вся загвостка в том что я нашёл несколько вариантов программной реализации и не один из них не могу понять т.к там очень сложный синтаксис.Такое ощущение ,что его писали злостные программеры,а читая теорию я не нахожу ничего сложного в интерполяции мне просто не догнать как это сделать в delphi.
 
?
#18
Для: masterdelphi
<!--QuoteBegin-masterdelphi+25:05:2006, 20:58 -->
<span class="vbquote">(masterdelphi @ 25:05:2006, 20:58 )</span><!--QuoteEBegin-->я нашёл несколько вариантов программной реализации и не один из них не могу понять
[snapback]36696" rel="nofollow" target="_blank[/snapback]​
[/quote]
кинь сюда - попробуем разжевать.
 
M

masterdelphi

#19
Для: masterdelphi

кинь сюда - попробуем разжевать.
TVector2f = Record {Вектор в двумерном пространстве}
X,Y:Real
End;

TVector = Record {Вектор в трехмерном пространстве}
X,Y,Z:Real
End;

TArrPoints = Array of TVector; {Координаты точек}

TInteger = Array [1..3] of Integer;
TArrLink = Array of TInteger; {Массив связей}

ArrPoints: TArrPoints; {Координаты точек}
ArrLink: TArrLink; {Массив связей}
Center: TVector; {Центр фигуры}
VertexNormals: TArrPoints; {Массив векторов нормалей к вершинам}
SunR, SunG, SunB: TVector; {Координаты источника света}
Rc,Gc,Bc: Boolean; {Включен/выкл. источники света}
Function LengthV (Var A : TVector): Real;
{Длина вектора А}
Function DotProduct (Var A, B : TVector): Real;
{Скалярное произведение векторов A и B}
Procedure GouraudHLine(X1,X2,Y:Integer;C1,C2:TColor);
Var I,tmp :Integer;
C :DWord;
C1R,C1G,C1B :Byte;
C2R,C2G,C2B :Byte;
n1r,n1g,n1b :Byte;
Begin {==================== Гор. линия для метода Гуру ====================}
C1:=((C1 and $FF) shl 16)+(((C1 shr 8) and $FF) shl 8)+((C1 shr 16) and $FF);
C2:=((C2 and $FF) shl 16)+(((C2 shr 8) and $FF) shl 8)+((C2 shr 16) and $FF);

If X2<X1 then Begin tmp:=X1;X1:=X2;X2:=tmp;C:=C1;C1:=C2;C2:=C;End;
C1R:=C1 shr 16; C1G:=C1 shr 8; C1B:=C1;
C2R:=C2 shr 16; C2G:=C2 shr 8; C2B:=C2;
if x2=x1 then
Begin
MainForm.Canv.DIB.Pixels[X1,Y]:=C1;
Exit;
End;
with MainForm.canv.DIB do
For I:=X1 to X2 do
Begin
n1r:=round(c1r+(I-X1)*(c2r-c1r)/(x2-x1));
n1g:=round(c1g+(I-X1)*(c2g-c1g)/(x2-x1));
n1b:=round(c1b+(I-X1)*(c2b-c1b)/(x2-x1));
C:=(n1r shl 16)+(n1g shl 8)+n1b;
Pixels[I,Y]:=C;
End;
End;

Procedure GouraudTriangle(X1,Y1,X2,Y2,X3,Y3:Integer;C1,C2,C3:TColor);
var tmp,sy,sx1,sx2 :Integer;
tc,c,rc1,rc2 :DWord;
l1,l2,l3,sl1,sl2 :Real;
u,w,t :Real;
e1r,e1g,e1b :Real;
e2r,e2g,e2b :Real;
c1r,c1g,c1b :Word;
c2r,c2g,c2b :Word;
c3r,c3g,c3b :Word;
Begin {==================== Интерполированный треугольник (по Гуро) ====================}
// здесь сортируем вершины (A,B,C)
if (y1>y2) then Begin tmp:=y1;y1:=y2;y2:=tmp;tmp:=x1;x1:=x2;x2:=tmp;tc:=C1;C1:=C2;C2:=tc;End;
if (y1>y3) then Begin tmp:=y1;y1:=y3;y3:=tmp;tmp:=x1;x1:=x3;x3:=tmp;tc:=C1;C1:=C3;C3:=tc;End;
if (y2>y3) then Begin tmp:=y2;y2:=y3;y3:=tmp;tmp:=x2;x2:=x3;x3:=tmp;tc:=C2;C2:=C3;C3:=tc;End;
if (y1=y3) then Exit;
// Вычисление длин всех ребер
l1:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
l2:=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2));
l3:=sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1));
// Цветовые компоненты
c1r:=(c1 shr 16) and $FF;c1g:=(c1 shr 8) and $FF;c1b:=c1 and $FF;
c2r:=(c2 shr 16) and $FF;c2g:=(c2 shr 8) and $FF;c2b:=c2 and $FF;
c3r:=(c3 shr 16) and $FF;c3g:=(c3 shr 8) and $FF;c3b:=c3 and $FF;
// Теперь проходим по первой полвине треугольника (1,2,4);
if ((y1<>y2) and (l1<>0) and (l3<>0)) then
for sy:=y1 to y2 do
Begin
sx1:=round(x1+(sy-y1)*(x3-x1)/(y3-y1));
sx2:=round(x1+(sy-y1)*(x2-x1)/(y2-y1));
sl1:=sqrt((sy-y1)*(sy-y1)+(sx1-x1)*(sx1-x1));
sl2:=sqrt((sy-y1)*(sy-y1)+(sx2-x1)*(sx2-x1));
u:=sl1/l3;
w:=sl2/l1;
e1r:=u*c3r+(1-u)*c1r;e1g:=u*c3g+(1-u)*c1g;e1b:=u*c3b+(1-u)*c1b;
e2r:=w*c2r+(1-w)*c1r;e2g:=w*c2g+(1-w)*c1g;e2b:=w*c2b+(1-w)*c1b;
C1:=(trunc(e1r) shl 16)+(trunc(e1g) shl 8)+trunc(e1b);
C2:=(trunc(e2r) shl 16)+(trunc(e2g) shl 8)+trunc(e2b);
GouraudHLine(sx1,sx2,sy,C1,C2);
End;
// Теперь проходим по второй полвине треугольника (2,4,3);
if ((y2<>y3) and (l2<>0) and (l3<>0)) then
for sy:=y2 to y3 do
Begin
sx1:=round(x1+(sy-y1)*(x3-x1)/(y3-y1));
sx2:=round(x2+(sy-y2)*(x3-x2)/(y3-y2));
sl1:=sqrt((sy-y1)*(sy-y1)+(sx1-x1)*(sx1-x1));
sl2:=sqrt((sy-y2)*(sy-y2)+(sx2-x2)*(sx2-x2));
u:=sl1/l3;
w:=sl2/l2;
e1r:=u*c3r+(1-u)*c1r;e1g:=u*c3g+(1-u)*c1g;e1b:=u*c3b+(1-u)*c1b;
e2r:=w*c3r+(1-w)*c2r;e2g:=w*c3g+(1-w)*c2g;e2b:=w*c3b+(1-w)*c2b;
C1:=(trunc(e1r) shl 16)+(trunc(e1g) shl 8)+trunc(e1b);
C2:=(trunc(e2r) shl 16)+(trunc(e2g) shl 8)+trunc(e2b);
GouraudHLine(sx1,sx2,sy,C1,C2);
End;
End;

//##############################################################################


procedure TMainForm.CalcGouraudColor(N: Integer; Var R,G,B: Integer);
Var S: TVector;
R1,G1,B1: Real;
Begin {================ Расчет освещенности по Гуру ================}
S.x:=SunR.x-ArrPoints[N].x;
S.y:=SunR.y-ArrPoints[N].y;
S.z:=SunR.z-ArrPoints[N].z;
R1:= 0.5 + 0.5 * DotProduct(VertexNormals[N], S) / LengthV(S);

S.x:=SunG.x-ArrPoints[N].x;
S.y:=SunG.y-ArrPoints[N].y;
S.z:=SunG.z-ArrPoints[N].z;
G1:= 0.5 + 0.5 * DotProduct(VertexNormals[N], S) / LengthV(S);

S.x:=SunB.x-ArrPoints[N].x;
S.y:=SunB.y-ArrPoints[N].y;
S.z:=SunB.z-ArrPoints[N].z;
B1:= 0.5 + 0.5 * DotProduct(VertexNormals[N], S) / LengthV(S);

IF Not Rc Then R1:=0;
IF Not Gc Then G1:=0;
IF Not Bc Then B1:=0;

R:=Round(R1*255);
G:=Round(G1*255);
B:=Round(B1*255);
End;

procedure GouraudFace(N: Integer);
Var R,G,B, R1,G1,B1, R2,G2,B2: Integer;
begin {============ Вывод интерполированной закрашенной грани ============}
With MainForm do
Begin
CalcGouraudColor(ArrLink[N,1], R,G,:);
CalcGouraudColor(ArrLink[N,2], R1,G1,B1);
CalcGouraudColor(ArrLink[N,3], R2,G2,B2);
GouraudTriangle(
Round(Get2dX(ArrPoints[ArrLink[N,1]])),
Round(Get2dY(ArrPoints[ArrLink[N,1]])),
Round(Get2dX(ArrPoints[ArrLink[N,2]])),
Round(Get2dY(ArrPoints[ArrLink[N,2]])),
Round(Get2dX(ArrPoints[ArrLink[N,3]])),
Round(Get2dY(ArrPoints[ArrLink[N,3]])),
RGB(R,G,:(,RGB(R1,G1,B1),RGB(R2,G2,B2));
End;
end;

для половины функций я не могу найти пояснения,это только процедура именно расчета освещения, я че-то не могу понять где здесь метод Гуро,+ эта программа состоит из 4 подпрограмм, я могу скинуть целую папку кода к этой проге
 
Статус
Закрыто для дальнейших ответов.