Определение принадлежности точки n-му шестиугольнику
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.35] |
|
|
правила раздела Алгоритмы

Определение принадлежности точки n-му шестиугольнику
|
|
|
|
|
Игровое поле рисую так:
![]() ![]() for i := 0 to 25 do begin for j := 0 to 50 do begin Image2.Canvas.Brush.Color := Map.ColM[i, j]; if Odd(i) then begin dx := 6; dy := 6; Image2.Canvas.Polygon( [Point(0 + dx * i, 6 + dy * j), Point(3 + dx * i, 3 + dy * j), Point(6 + dx * i, 3 + dy * j), Point(9 + dx * i, 6 + dy * j), Point(6 + dx * i, 9 + dy * j), Point(3 + dx * i, 9 + dy * j)]); end else begin dx := 6; dy := 6; ii := i - 1; Image2.Canvas.Polygon( [Point(6 + dx * ii, 3 + dy * j), Point(9 + dx * ii, 0 + dy * j), Point(12 + dx * ii, 0 + dy * j), Point(15 + dx * ii, 3 + dy * j), Point(12 + dx * ii, 6 + dy * j), Point(9 + dx * ii, 6 + dy * j)]); end; end; end; Вопрос: Как в обработчике ![]() ![]() procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer); begin Label3.Caption := IntToStr(X) + '-' + IntToStr(Y); end; Вместо X и Y получить i и j, т.е. номер 6-гранника? |
|
Сообщ.
#2
,
|
|
|
|
Немного другое рисование поля
![]() ![]() const Edge = 80; HalfEdge = Edge div 2; HalfHgt = Edge * 1732 div 2000; //Sqrt(3)/2 Hgt = HalfHgt * 2; Wdt = 2 * Edge; CellWdt = 3 * HalfEdge; Shift = Edge; function TForm6.FindHexCell(x, y: Integer): TPoint; var nx, remx, ny, remy, tmp: Integer; begin x := x - Shift + HalfEdge; y := y - Shift + HalfHgt; nx := x div CellWdt; remx := ((x mod CellWdt) - CellWdt) * HalfHgt; tmp := -1; if Odd(nx) then begin y := y - HalfHgt; Inc(tmp); end; ny := y div Hgt; remy := ((y mod Hgt) - HalfHgt) * HalfEdge; if remy < remx then begin Inc(nx); Inc(ny, tmp); end; if remy > -remx then begin Inc(nx); Inc(ny, tmp + 1); end; Result.X := nx; Result.Y := ny; end; procedure TForm6.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var p: TPoint; begin p := FindHexCell(x, y); Caption := Format(' %d: %d', [p.Y, p.X]); end; procedure TForm6.FormPaint(Sender: TObject); var ix, iy, xx, yy: Integer; s: string; procedure DrawHex; begin Canvas.MoveTo(xx - Edge, yy); Canvas.LineTo(xx - HalfEdge, yy - HalfHgt); Canvas.LineTo(xx + HalfEdge, yy - HalfHgt); Canvas.LineTo(xx + Edge, yy); Canvas.LineTo(xx + HalfEdge, yy + HalfHgt); Canvas.LineTo(xx - HalfEdge, yy + HalfHgt); Canvas.LineTo(xx - Edge, yy); end; begin for iy := 0 to 3 do for ix := 0 to 3 do begin yy := Shift + iy * Hgt; if Odd(ix) then yy := yy + HalfHgt; xx := Shift + CellWdt * ix; DrawHex; s := Format('%d: %d', [iy, ix]); Canvas.TextOut(xx - 10, yy - 10, s); end; end; |
|
Сообщ.
#3
,
|
|
|
|
СПАСИБО!!!
|
|
Сообщ.
#4
,
|
|
|
|
MBo
А не подскажешь этот алгоритм для 8-ми угольника? |
|
Сообщ.
#5
,
|
|
|
|
А как 8-угольниками замостить плоскость?
|
|
Сообщ.
#6
,
|
|
|
|
Точно.
Ни как! Добавлено Тогда еще вопрос, поиск пути. Работаю по волновому алгоритму. Когда поле было квадратное, проблем небыло, но вот на 6-ти гранном не получается. Переодически выпадают клетки из пути, т.е. когда просчет идет ячейки с координатами (х+1,у+1) и (х-1,у-1). Другие клетки(х,у-1),(х+1,0) без проблем. Почему такая проблема? |
|
Сообщ.
#7
,
|
|
|
|
Наверно, ошибки в алгоритме
Гексагональное поле отличается от квадратного тем, что ячейки не 4-х связные, а 6- связные, т.е каждая имеет 6 соседей по ребрам, и ты каких-то соседей упускаешь |
|
Сообщ.
#8
,
|
|
|
|
Решил проблему. Ошибка была в том, что номера соседних квадратов при 6-ти угольной системе, в четных и нечетных столбцах разные.
Если надо, могу полученный код скинуть. |