Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Кто может помочь!!


Автор: masterdelphi 23.5.2006, 23:37
Кто может помочь!!Надо сделать такую процедуру или функцию!У меня на форме три кнопки Button и три Image,надо чтобы при нажатии на Button1 рисование происходило в Image1,при нажатии на Button2 рисование происходило в Image2 и т.д.,на каждом image цикл рисования одинаков, важна только реакция на конкретный Button!!   

Автор: D4rk 23.5.2006, 23:44
1) Оформи цикл рисования как отдельную процедуру. В качестве параметра будет Image1, Image2 или Image3.

2) Напиши процедуры

TForm1.Button1Click
TForm2.Button1Click
TForm3.Button1Click

В них будешь вызывать процедуру рисования...

Или я чего-то не догоняю?  

Автор: masterdelphi 23.5.2006, 23:56
Проблема в том что у меня 20 фигур для прорисовки и если для них писать по три процедуры рисования (для каждого Image) то получится 60 процедур, я хочу чтобы при нажатии на Button1,Button2,button3 загружалась одна и та же процедура(для одной фигуры) прорисовки но с разным Image(1,2,3-соответственно). 

Автор: skyboy 24.5.2006, 00:06
masterdelphi,по нажатию на кнопку что должно происходить? Выставляется какой-то признак, типа "номер текущего Image"? Тогда не проще ли сделать на checkbox'ax интерфейс? И по нажатию одной кнопки ты по состоянию checkbox'ов определяешь, где рисовать... А вообще - обрисуй пояснее картину... А то я тебе могу и про FindComponent в цикле рассказать, только знать бы ещё - надо оно тебе или нет... 

Автор: masterdelphi 24.5.2006, 00:22
Поясняю:
Обязательно надо с 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'ами.

Добавлено @ 00:31 
FindComponent это по ходу та тема что надо... 

Автор: Sunvas 24.5.2006, 07:02
Код

procedure proc(imm:timage);
begin...
with imm.canvas do
begin
reactangle(0,0,50,50);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
proc(image1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
proc(image2);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
proc(image3);
end;
 

Автор: skyboy 24.5.2006, 08:25
Пущай все твои button'ы имеют один обработчик событий: OnMyButtonClick.
Тогда... 
Код

procedure DrawOnMyImage(MyImage:TImage)
var...
begin
...
with MyImage.canvas do
begin
<само рисование>
end;

procedure OnMyButtonClick(Sender:TObject);
var n:i nteger;
      TenpImage: TImage;
begin
n:= StrToInt(copy((Sender as TButton).Name,7,length((Sender as TButton).Name)-6)); // определяем номер кнопки : Button2 -> 2, Button2048 -> 2048
TempImage:= FindComponent('Image' + IntToStr(n)) as TImage; // находим компонент Image типа TImage с таким же номером
DrawOnMyImage(TempImage); // передаём найденный Image как параметр в процедуру рисования
end;
 

Автор: masterdelphi 24.5.2006, 08:26
Понял, работает.
Спасибо парни!!
 

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

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

Автор: Yanis 24.5.2006, 09:00
masterdelphi
А тебя не смущает, что при движении над Image событие OnMouseMove у формы не срабатывает?  

Автор: masterdelphi 24.5.2006, 09:05
Я если честно этого не знал!!Т.Е.
 procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
действует только над формой и нет возможности сделать её относительно Image?? 

Автор: Yanis 24.5.2006, 09:30
Цитата(masterdelphi @  24.5.2006,  10:05 Найти цитируемый пост)
и нет возможности сделать её относительно Image??  
Можно посчитать относительно чего угодно. Всё зависит от того в каком собитии ты будешь получать координаты.

Вообще есть один способ как определить положение курсора, когда он двигается над формой... Не знаю подойдёт ли он тебе. Вот:
Код
type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure FrmMouseMove(var M: TWMNCHitTest); message WM_NCHITTEST;
  public
    { Public declarations }
  end;

{ ... }

procedure TForm1.FrmMouseMove(var M: TWMNCHitTest);
begin
  Inherited;
  Caption := Format('%d, %d', [M.XPos, M.YPos]);
end;
 

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

Автор: Yanis 24.5.2006, 10:08
А почему бы тогда не использовать OnMouseMove Image'а? Если ты не в курсе, то помимо функции Win API GetCursorPos существует глобальный объект Mouse с помощью которого можно узнать положение курсора на экране. Я не понимаю в чём загвоздка? smile Положение курсора относительно Image можно и так вычислить:
Код
function GetMPos(i: TImage): TPoint;
begin
  Result := i.ScreenToClient(Mouse.CursorPos);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Caption := Format('%d, %d', [GetMPos(Image1).x, GetMPos(Image1).y]);
end;
 

Автор: masterdelphi 24.5.2006, 11:10
Все догнал!!!!
Слушай а не скажешь как мне поставить условие для попадания курсора на фигуру(которую сам нарисовал в Image)? 

Автор: Yanis 24.5.2006, 13:48
Поиском пользоваться умеешь? 
Код
{ **** UBPFD *********** by kladovka.net.ru ****
>> Проверка попадания точки в треугольник

Проверяет попадает ли точка P в треугольник ABC.
Вершины должны быть перечислены против часовой стрелки.

Зависимости: нет
Автор:       Fenik, fenik@nm.ru, Новоуральск
Copyright:   Николай Федоровских
Дата:        8 октября 2004 г.
********************************************** }

function PtInTriang(const P, A, B, C: TPoint): Boolean;
{Внимание!! Вершины должны быть заданы против часовой стрелки!
        A
       / \
      / \
     B----C }
begin
  Result := False;
  if (P.x-A.x)*(A.y-B.y) - (P.y-A.y)*(A.x-B.x) >= 0 then
  if (P.x-B.x)*(B.y-C.y) - (P.y-B.y)*(B.x-C.x) >= 0 then
  if (P.x-C.x)*(C.y-A.y) - (P.y-C.y)*(C.x-A.x) >= 0 then
    Result := True;
end;
  

Автор: skyboy 24.5.2006, 14:40
можно воспользоваться Windows API функцией:
Цитата

The PtInRegion function determines whether the specified point is inside the specified region. 
BOOL PtInRegion(
    HRGN hrgn,    // handle of region 
    int X,    // x-coordinate of point  
    int Y  // y-coordinate of point  
   );    

Parameters
hrgn
Identifies the region to be examined. 
X
Specifies the x-coordinate of the point. 
Y
Specifies the y-coordinate of the point. 

Return Values
If the specified point is in the region, the return value is nonzero.
If the specified point is not in the region, the return value is zero. 
 

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

Добавлено @ 17:42 
?
 

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

Автор: masterdelphi 25.5.2006, 14:26
Поясню: алгоритм освещения надо проходить его в определенном порядке(алгоритм Гуро-интерполяция интенсивностей):
координаты освещаемого в данный момент пикселя это не координаты на самом Image т.е. я хочу сказать что у меня есть n-угольник в трёхмерном пространстве, для каждого пикселя(в смысле точки) этого многоугольника надо расчитать интенсивность используя его реальные координаты,далее это массив интенсивностей надо сохранить , выполнить операцию проецирования на Image и присвоить ранее расчитанные интенсивности уже спроецированным пикселям.
 

Автор: sergejzr 26.5.2006, 12:51
Модератор: http://forum.vingrad.ru/index.php?showtopic=96391 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)