На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Определение принадлежности точки n-му шестиугольнику
    Игровое поле рисую так:
    ExpandedWrap disabled
        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;

    Вопрос:
    Как в обработчике
    ExpandedWrap disabled
      procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
        Y: integer);
      begin
        Label3.Caption := IntToStr(X) + '-' + IntToStr(Y);
      end;

    Вместо X и Y получить i и j, т.е. номер 6-гранника?
    Сообщение отредактировано: Stud555 -
      Немного другое рисование поля

      ExpandedWrap disabled
        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;
        СПАСИБО!!!
          MBo
          А не подскажешь этот алгоритм для 8-ми угольника?
            А как 8-угольниками замостить плоскость?
              Точно. :D Ни как!

              Добавлено
              Тогда еще вопрос, поиск пути.

              Работаю по волновому алгоритму. Когда поле было квадратное, проблем небыло, но вот на 6-ти гранном не получается. Переодически выпадают клетки из пути, т.е. когда просчет идет ячейки с координатами (х+1,у+1) и (х-1,у-1). Другие клетки(х,у-1),(х+1,0) без проблем.

              Почему такая проблема?
              Сообщение отредактировано: Stud555 -
                Наверно, ошибки в алгоритме
                Гексагональное поле отличается от квадратного тем, что ячейки не 4-х связные, а 6- связные, т.е каждая имеет 6 соседей по ребрам, и ты каких-то соседей упускаешь
                  Решил проблему. Ошибка была в том, что номера соседних квадратов при 6-ти угольной системе, в четных и нечетных столбцах разные.

                  Если надо, могу полученный код скинуть.
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0517 ]   [ 15 queries used ]   [ Generated: 20.04.26, 14:46 GMT ]