[C++] Siatka Heksagonalna
Ostatnio zmodyfikowano 2018-07-19 20:35
TenTyp Temat założony przez niniejszego użytkownika |
[C++] Siatka Heksagonalna » 2018-07-19 11:37:36 Witam zmagam się z pewnym problemem a mianowicie chodzi mi o rozmieszczenie pól na siatce heksagonalnejjak na razie po wielu obliczeniach (na kartce i nie tylko... doszedłem do pewnego wzoru - a mianowicie.. void Map::DrawMap( sf::RenderWindow * WINDOW ) { CURRENT = FIRST; while( CURRENT != NULL ) { if( CURRENT->y % 2 == 0 ) { CURRENT->Image->setPosition( CURRENT->x *( 50 +( 50 * sqrt( 3 ) / 2 ) ), CURRENT->y * 50 * sqrt( 3 ) ); WINDOW->draw( * CURRENT->Image ); } else { CURRENT->Image->setPosition( CURRENT->x *( 50 +( 50 * sqrt( 3 ) / 2 ) ) +(( 50 * sqrt( 3 ) / 2 ) ), CURRENT->y * 50 * sqrt( 3 ) ); WINDOW->draw( * CURRENT->Image ); } CURRENT = CURRENT->NEXT; } }
No niestety nie udało się .. nigdzie przykładowego kodu nie znalazłem ani tekstów dotyczących tego zagadnienia. Jako, że z grą się śpieszą pośpieszyłem i na forum :-) // próbowałem również nałożyć border'a na tę szkaradną siatkę a oto i efekt. |
|
pekfos |
» 2018-07-19 13:31:08 A powinno wyglądać jak..? To co na pierwszym obrazku tylko bez odstępów? Nie wiadomo co dokładnie chcesz osiągnąć. Zgaduję, że problem jest z brakiem zaokrąglania - nie powinieneś wyświetlać rzeczy na współrzędnych w ułamkach pikseli. |
|
TenTyp Temat założony przez niniejszego użytkownika |
» 2018-07-19 18:32:30 tak bez odstępów.
potrzebowałem bym wzoru, który umożliwiłby mi pozbyć się tych odstępów. po ludzku potrzebuję wzoru który w oparciu o daną grubość krawędzi sześcianu wyznaczy jego położenie tak ażeby odległość pomiędzy dwoma sąsiadującymi sześciokątami była zerowa a elastyczność wzoru polegała by między innymi na skalowaniu. nie potrafię sam dojść do tego. proszę pomóż (mam tylko jeden dzień wolnego a i po nocce jestem :-/ )
chwyciłem za matmę gdyż nic innego nie przyszło mi do głowy.. doradziłbyś?
|
|
pekfos |
» 2018-07-19 19:11:01 grubość krawędzi sześcianu |
??? Na szybko hacknięty kod w SFMLu constexpr int HexSide = 50; constexpr int HexWidth = HexSide * 1.73205080f; constexpr int HexHeight = HexSide * 2;
for( int x = 0; x < 10; ++x ) for( int y = 0; y < 10; ++y ) { int posx = x * HexWidth +( y % 2 ) * HexWidth / 2; int posy = y * HexHeight * 3 / 4; sf::CircleShape cs( HexSide, 6 ); cs.setPosition( posx, posy ); if( y % 2 ) cs.setFillColor( x % 2 ? sf::Color::Green : sf::Color::Red ); else cs.setFillColor( x % 2 ? sf::Color::Cyan: sf::Color::Blue ); cam.draw( cs ); } https://zapodaj.net/15814e1cc132a.png.html |
|
TenTyp Temat założony przez niniejszego użytkownika |
» 2018-07-19 20:35:37 CURRENT jest to wskaźnik na Obiekt przechowujący kształt sześciokąta oraz jego pozycję na mapie XY, więc to było zrobione chodziło mi głównie o ten wzór. class Field { public: int x, y; sf::CircleShape * Image; };
Już dostrzegłem mój błąd, drobny ale nijak nie potrafiłem go rozwiązać, a tym bardziej w jednym wzorze. Ostatecznie otrzymałem taki kod i jest on poprawnym rozwiązaniem. float HexWidth = 50 * sqrt( 3 ); float HexHeight = 50 * 2;
CURRENT = FIRST; while( CURRENT != NULL ) { CURRENT->Image->setPosition( CURRENT->x * HexWidth +( CURRENT->y % 2 ) * HexWidth / 2, CURRENT->y * HexHeight * 3 / 4 ); WINDOW->draw( * CURRENT->Image ); CURRENT = CURRENT->NEXT; }
Dzięki wielkie zamykam temat. ;-) |
|
« 1 » |