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

Тема в разделе "Delphi - Компоненты", создана пользователем masterdelphi, 24 май 2006.

Статус темы:
Закрыта.
  1. masterdelphi

    masterdelphi Гость

    Кто может помочь!!Надо сделать такую процедуру или функцию!У меня на форме три кнопки 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'ами
     
  2. Barmutik

    Barmutik Гость

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

    ???? Гость

    Для: masterdelphi
    можно что-то типа
    Код (Text):
    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.
     
  4. masterdelphi

    masterdelphi Гость

    Кто знает как сделать так чтобы при движении(нажатии, перемещении, отпускании) курсора мыши его координаты считывались не с формы а с 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()
     
  6. masterdelphi

    masterdelphi Гость

    Т.е. поясни пожалуйста?
     
  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
     
  8. masterdelphi

    masterdelphi Гость

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


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

    Barmutik Гость

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

    masterdelphi Гость

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

    masterdelphi Гость

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

    masterdelphi Гость

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


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

    Barmutik Гость

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

    В чём проблемы ?
     
  14. Razoomnick

    Razoomnick Гость

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

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

    masterdelphi Гость

    Проблема в самом алгоритме освещения надо проходить его в определенном порядке(алгоритм Гуро-интерполяция интенсивностей):
    координаты освещаемого в данный момент пикселя это не координаты на самом 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
     
  17. masterdelphi

    masterdelphi Гость

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

    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 подпрограмм, я могу скинуть целую папку кода к этой проге
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей