Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Siatka Heksagonalna

Ostatnio zmodyfikowano 2018-07-19 20:35
Autor Wiadomość
CPnHorror
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 heksagonalnej

jak na razie po wielu obliczeniach (na kartce i nie tylko... doszedłem do pewnego wzoru - a mianowicie..

C/C++
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 ) ); //x>=0 && y>=0 && radius=50
            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.

przed MakeBorder (best idea ^^)
przed MakeBorder (best idea ^^)
 
po MakeBorder ... :-/
po MakeBorder ... :-/
 
P-171915
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.
P-171917
CPnHorror
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ś?
P-171918
pekfos
» 2018-07-19 19:11:01
grubość krawędzi sześcianu
???

Na szybko hacknięty kod w SFMLu
C/C++
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 )
{
    // Pozycja prostokąta HexWidth x HexHeight w który wpisany jest sześciokąt
    int posx = x * HexWidth +( y % 2 ) * HexWidth / 2;
    int posy = y * HexHeight * 3 / 4;
   
    // Jakoś tam narysuj ten sześciokąt..
    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
P-171919
CPnHorror
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.

C/C++
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.

C/C++
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. ;-)
P-171924
« 1 »
  Strona 1 z 1