Рисование шестиугольника

Используя Firemonkey XE2, я смог использовать компонент TCube для создания кубической карты, но теперь мне нужна шестиугольная карта. Я не смог найти вариант трехмерной формы шестиугольника. Я подумал, что вы можете создать THex, похожий на TCube, но я не смог этого сделать или хотя бы приблизиться. Может ли кто-нибудь предоставить образец этого?

Я ищу форму шестиугольной призмы.

введите здесь описание изображения


person Glen Morse    schedule 16.06.2014    source источник
comment
Шестиугольник не является трехмерной формой, трехмерная сферическая форма с использованием шестиугольных плиток на самом деле не возможно. Вы хотите создать Додекаэдр?   -  person James Barrass    schedule 18.06.2014
comment
гм, больше никакой шестиугольной призмы en.wikipedia.org/wiki/Uniform_prism   -  person Glen Morse    schedule 18.06.2014
comment
Лучше ответь кому! не думаю, что любой из них стоит 500 повторений   -  person Glen Morse    schedule 23.06.2014


Ответы (3)


Я делаю то же, что и вы, и разрабатываю стратегическую игру с шестиугольной картой в Delphi.

У вас есть объект, который вам нужен в самом Delphi, и это TCylinder. Вы должны установить SubdivisionAxes от 12 до 6 (12 по умолчанию для этого объекта), и это все, что вам нужно, чтобы получить объект, который вы хотите.

для реализации вашей карты я предлагаю вам также проверить эту ссылку. http://www.redblobgames.com/grids/hexagons/

удачи.

person Loghman    schedule 23.06.2014
comment
Идеально! Также в любом случае, чтобы связаться с вами снаружи здесь. Хотелось бы посмотреть, над чем вы работаете. - person Glen Morse; 23.06.2014
comment
@GlenMorse, вы можете найти мою электронную почту в моем профиле. спасибо за принятие ответа :) - person Loghman; 23.06.2014
comment
Спасибо понял .. собираюсь отправить вам кое-что в ближайшее время .. ура - person Glen Morse; 23.06.2014

Вам нужно будет получить от TCustomMesh и переопределить Render, чтобы передать вычисленные вами вершины.

Начните с центра и радиуса, а точки следующие. Предполагая, что форма построена параллельно плоскости и впоследствии преобразована. Следующее создает вертикальную шестиугольную призму (у меня нет IDE atm и нет возможности проверить это!).

ClearPoints();
prismEnd := -1;
while prismEnd < 2 do
begin
    Z := Center.Z + (prismEnd * length)
    angle = 0;
    AddPoint(0, 0, Z);
    while angle < 360 do
    begin
        X := Center.X + (radius * Cos(DegToRad(angle)));
        Y := Center.Y + (radius * Sin(DegToRad(angle)));
        AddPoint(X, Y, Z);
        Inc(angle, 60);
    end;
    Inc(prismEnd, 2);
end;

Для 6 значений это создает TexCoords должно быть

Tex X   Tex Y 
1       0.5
0.75    1
0.25    1
0       0.5
0.25    0
0.75    0

Для рендеринга вам понадобится 24 треугольника, что в зависимости от вашего метода рисования может потребовать до 72 индексов.

но это будет зависеть от того, как вы сопоставляете свои текстуры.

Я нашел эту ссылку, в которой есть примеры наследование и использование TCustomMesh

теоретически это должно обеспечить такую ​​форму, как

введите здесь описание изображения

person James Barrass    schedule 18.06.2014
comment
Delphi не имеет возможности шага в циклах for. Однако есть возможность использовать некоторые конструкции, показанные здесь. - person LU RD; 18.06.2014
comment
@LURD, я думаю, прошло слишком много времени с тех пор, как я работал с Delphi! Я исправлю это сейчас - person James Barrass; 18.06.2014
comment
Я понимаю, как или расчеты о том, как получить данные, как вы показали, но как мне включить это в компонент X, чтобы нарисовать его. - person Glen Morse; 18.06.2014
comment
@GlenMorse Вы не рисуете это, вы предоставляете вершины, индексы и координаты текса и передаете их все DrawTriangles в переопределении метода Render - person James Barrass; 18.06.2014
comment
@JamesBarrass собирается попробовать и посмотреть, смогу ли я заставить это работать, используя пользовательскую сетку.. не уходи далеко :D - person Glen Morse; 19.06.2014
comment
@JamesBarrass хорошо, пока я скопировал все материалы TAnnulus с ошибкой в ​​uses FMX.Materials Не уверен, идет ли он под другим именем или я могу его где-то скачать .. Во всяком случае, теперь отсюда я могу сделать THex = class(TAnnulus) Правильно? - person Glen Morse; 19.06.2014
comment
Вы можете, но вы, вероятно, замените большую часть его функциональности. TexCoords являются частью VertexBuffer в вызове DrawTriangles. Вы можете увидеть, как они назначаются в функции BuildAnnulus (которая для вас становится функцией BuildHex) - person James Barrass; 19.06.2014
comment
@JamesBarrass спасибо за помощь, но я думаю, мне понадобится ответ с полным примером. Как будто я что-то упускаю. - person Glen Morse; 19.06.2014

Вы можете использовать TMesh для создания любой формы, которая вам нужна.

Используйте свойство Data, чтобы указать точки, нормали и текстуры для каждой точки, а также порядок, в котором рисуются результирующие треугольники.

Все, что вам нужно, это предварительно рассчитанные точки и нормали для желаемой формы шестиугольника (я думаю, это можно найти в Google или создать в специализированном редакторе форм)

person VitaliyG    schedule 18.06.2014
comment
я не мог найти их в Google и все еще немного новичок в этом 3D. непонятно как это вычислить - person Glen Morse; 18.06.2014