Текущий архив: 2002.09.26;
Скачать: CL | DM;
Внизкоорд. обьектов на рис.(Polygon) как в выводить надпись над ними Найти похожие ветки
← →
PSYS (2002-05-27 01:38) [0]Есть координаты обьектов на рисунке(Canvas.Polygon) как в выводить надпись над ними когда на них кликаешь мышкой?
Можно сказать по другому как опредилть что я в нужной выделенной области?
← →
MBo (2002-05-27 06:34) [1]PtInRegion
← →
PSYS (2002-05-27 13:20) [2]в хелпе по делфям ненашел.
← →
MBo (2002-05-27 13:25) [3]WinSDK help
но надо будет создавать region для каждого polygon.
Есть формулы/функции для определения, лежит ли точка внутри многоугольника, но, если не ошибаюсь, только для выпуклых.
← →
PSYS (2002-05-27 23:09) [4]эх нету winsdl helpА, куплю где-нить.
а пример не можешь изнего кинуть?
← →
MBo (2002-05-28 07:46) [5]хелп SDK входит в поставку Delphi, скорее всего, ты его просто не установил, либо у тебя урезанный комплект. online- msdn.microsoft.com . с примерами там туго.
вот еще нашел.
Can anyone help me with detecting if the screen coordinates that a user has clicked on lies within a defined polygon?
The code below is from Wm. Randolph Franklin with some minor modifications for speed. It returns 1 for strictly interior points, 0 for strictly exterior, and 0 or 1 for points on the boundary.
function PointInPolygonTest(x, y: Integer; aList: Array of TPoint): Boolean;
var
L, I, J: Integer;
function xp(aVal: Integer): Integer;
begin
Result := PPoint(@aList[aVal]).X;
end;
function yp(aVal: Integer): Integer;
begin
Result := PPoint(@aList[aVal]).Y;
end;
begin
Result := False;
L := Length(aList) ;
if L = 0 then
exit;
J := L - 1;
for I := 0 to L - 1 do
begin
if ((((yp(I) <= y) and (y < yp(J))) or ((yp(J) <= y) and (y < yp(I)))) and
(x < (xp(J) - xp(I)) * (y - yp(I)) / (yp(J) - yp(I)) + xp(I))) then
Result := not Result;
J := I;
end;
end;
Tip by John Hutchings
← →
MBo (2002-05-28 08:24) [6]пример использования rgn
procedure TForm1.Button1Click(Sender: TObject);
var rgn:hRgn;
br:TBrush;
pts:array[0..6] of TPoint;
x1,y,x2,deltax,deltay:integer;
begin
x1:=100;
x2:=400;
y:=200;
deltax:=5;
deltay:=100;
pts[0].x:=x1; pts[0].y:=y;
pts[1].x:=x1+deltax; pts[1].y:=y-deltay;
pts[2].x:=x2-deltax; pts[2].y:=y-2*deltay;
pts[3].x:=x2; pts[3].y:=y;
pts[4].x:=x2-deltax; pts[4].y:=y+2*deltay;
pts[5].x:=x1+deltax; pts[5].y:=y+deltay;
pts[6].x:=x1; pts[6].y:=y;
BeginPath(canvas.Handle);
PolyBezier(canvas.Handle,pts,7);
EndPath(canvas.Handle);
rgn:=PathToRegion(Canvas.Handle);
Canvas.brush.Color:=clRed;
FillRgn(Canvas.handle,Rgn,Canvas.Brush.Handle);
DeleteObject(rgn);
end;
← →
PSYS (2002-05-29 02:06) [7]буду пробовать. большой сенкс.
Страницы: 1 вся ветка
Текущий архив: 2002.09.26;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.007 c