Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.21;
Скачать: CL | DM;

Вниз

простенькая карта   Найти похожие ветки 

 
ev ©   (2002-09-27 21:23) [0]

Как сделать простенькую карту?
Т.е. надо картинку разделить на зоны (не прямоугольники),
в зоне можно создавать объекты.

Как это реализовать, с обработкой клика на зону и на объект?


 
ev ©   (2002-09-29 00:19) [1]

ау... мастера...
идейку подкинте :)


 
Rouse_ ©   (2002-09-29 00:24) [2]

Попробуй через регионы, код не подскажу, просто первое что пришло в голову, но это идейка...;)

Желаю успехов


 
Не спится...   (2002-09-29 01:46) [3]

Можно, действительно, через регионы - тогда см. ф-и

CreatePolygonRgn - создание региона
DeleteObject - уничтожение региона
PtInRegion - проверка попадания точки в регион
RectInRegion - ... прямоугольника
FillRgn - рисование региона.

А вобщем-то, можно и без регионов.
Проверить точку на попадание в полигон можно и так:

function PtInPolygon(P: array of TPoint; N, X, Y: Integer): Boolean;
var
i, j, k, Xi, Yi, Xj, Yj, Count, Intersect: Integer;
t: Double;
function MaxY(i, j: Integer; var k: Integer): Integer;
begin
if P[i].Y > P[j].Y then
begin Result := P[i].Y; k := i; end else
begin Result := P[j].Y; k := j; end;
end;

function MinY(i, j: Integer; var k: Integer): Integer;
begin
if P[i].Y > P[j].Y then
begin Result := P[j].Y; k := j; end else
begin Result := P[i].Y; k := i; end;
end;
begin
Count := N;
Intersect := 0;
for i := 0 to Count - 1 do
begin
j := (i+1)mod Count;
if not( P[i].Y = P[j].Y )and
not( ( Y<P[i].Y )and( Y<P[j].Y ) )and
not( ( Y>P[i].Y )and( Y>P[j].Y ) )then
if MaxY(i, j, k) = Y then begin if P[k].X > X then Inc(Intersect)end else
if not (MinY(i, j, k) = Y) then
begin
t := (Y - P[i].Y )/( P[j].Y - P[i].Y );
if (t>0)and(t<1)and(P[i].X+t*(P[j].X-P[i].X)>X)then Inc(Intersect);
end;
end;
Result := Intersect mod 2 = 1;
end;

Создаёшь классы примерно такого содержания

TFigure = class(TPersistent)
procedure Draw(Canvas: TCanvas); virtual; abstract;
function HitTest(X, Y: Integer): Boolean; virtual; abstract;
end;

TZone = class(TFigure)
private
FColor: TColor;
FPointCount: Integer;
FPolygon: array of TPoint;
FHRegion: HRGN;
// FObjects: TList;
public
procedure Draw(Canvas: TCanvas); override;
//begin
// Canvas.Brush.Color := FColor;
// FillRgn(Canvas.Handle, FHRegion, Canvas.Brush.Handle);
// // или Canvas.Polygon(FPolygon);
//end;
function HitTest(X, Y: Integer): Boolean; override;
//Проверка попадания в зону
//begin
// Result := PtInRegion(FHRegion);
// // или Result := PtInPlygon(FPlygon);
//end;
end;

TMap = class(TFigure)
private
FZones: TList
public
procedure Draw(Canvas: TCanvas); override;
//begin
// for i := 0 to FZones.Count - 1 do
// TZone(FZones[i]).Draw(Canvas);
//end;

procedure HandleMouse(...);
end;



Страницы: 1 вся ветка

Текущий архив: 2002.10.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.026 c
1-68738
Igor_
2002-10-11 12:10
2002.10.21
Временно отключить прорисовку формы


1-68844
Толик
2002-10-09 14:41
2002.10.21
TComboBox и его стили


1-68865
Asderg
2002-10-10 15:34
2002.10.21
TFileStream. How create file?


1-68842
User_OKA
2002-10-10 07:25
2002.10.21
Остановка цикла


1-68843
Павел Хабаров
2002-10-10 13:23
2002.10.21
Как программно передвигать курсор мыши