ОБСУЖДЕНИЕ

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

18 ответов 10 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Статус
Закрыто для дальнейших ответов.
Автор темы
Кто может помочь!!Надо сделать такую процедуру или функцию!У меня на форме три кнопки 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'ами
 
По нажатию на кнопку запоминайте в какой конкретно TImage Вы хотите рисовать.. а впроцедуре рисования обращайтесь к запомненному объекту ...
 
Для: 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.
 
Кто знает как сделать так чтобы при движении(нажатии, перемещении, отпускании) курсора мыши его координаты считывались не с формы а с Image!!!
Поясню:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
//координаты X и Y в этой процедуре это координаты на форме а мне надо на моем Image
end;
надо именно в этой процедуре!!!
 
<!--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()
 
Т.е. поясни пожалуйста?
 
<!--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
 
Ситуация такая я должен по Image перемещать треугольник с помощью мыши. Для этого мне и нужны координаты на Image(чтобы определить попадает курсор в треугольник или нет)!!!


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


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

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

последовательно суммируешь все углы из твоей точки до каждой вершины (т.е., если назвать твою точку 0, угол 1-0-2, 2-0-3 ... n-0-1), учитывая знак (скажем, против часовой - плюс, по - минус). Если точка внутри фигуры, сумма углов будет 2пи, иначе 0.
 
Проблема в самом алгоритме освещения надо проходить его в определенном порядке(алгоритм Гуро-интерполяция интенсивностей):
координаты освещаемого в данный момент пикселя это не координаты на самом Image т.е. я хочу сказать что у меня есть n-угольник в трёхмерном пространстве, для каждого пикселя(в смысле точки) этого многоугольника надо расчитать интенсивность используя его реальные координаты,далее это массив интенсивностей надо сохранить , выполнить операцию проецирования на Image и присвоить ранее расчитанные интенсивности уже спроецированным пикселям.
 
Для: 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
 
Вся загвостка в том что я нашёл несколько вариантов программной реализации и не один из них не могу понять т.к там очень сложный синтаксис.Такое ощущение ,что его писали злостные программеры,а читая теорию я не нахожу ничего сложного в интерполяции мне просто не догнать как это сделать в delphi.

Вся загвостка в том что я нашёл несколько вариантов программной реализации и не один из них не могу понять т.к там очень сложный синтаксис.Такое ощущение ,что его писали злостные программеры,а читая теорию я не нахожу ничего сложного в интерполяции мне просто не догнать как это сделать в delphi.
 
Для: 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]
кинь сюда - попробуем разжевать.
 
Для: 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 подпрограмм, я могу скинуть целую папку кода к этой проге
 
Статус
Закрыто для дальнейших ответов.