• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SFML ConvexShape, dziwne zachowania wielokątów

Object Storage Arubacloud
0 głosów
238 wizyt
pytanie zadane 2 grudnia 2018 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

Na szybko pisany kod

#include <SFML/Graphics.hpp>
#include <vector>

using namespace std;
using namespace sf;

int main()
{
    RenderWindow mainWindow( VideoMode( 800, 600 ), "shapes", Style::Close );
    Event event;
    Mouse mouse;
    Keyboard keyboard;

    CircleShape point( 6 );
    point.setFillColor( Color( 255, 0, 0, 200 ) );

    vector<int>points;
    bool leftButtonPressed = false;
    ConvexShape shape;
    shape.setFillColor( Color( 0, 255, 0, 100 ) );

    while( mainWindow.isOpen() )
    {
        mainWindow.clear();

        while( mainWindow.pollEvent( event ) )
        {
            if( event.type == Event::Closed )
            {
                mainWindow.close();
            }

            if( leftButtonPressed && !mouse.isButtonPressed( Mouse::Left ) )
            {
                leftButtonPressed = false;

                points.push_back( mouse.getPosition( mainWindow ).x );
                points.push_back( mouse.getPosition( mainWindow ).y );
            }
        }

        if( mouse.isButtonPressed( Mouse::Left ) )
        {
            leftButtonPressed = true;
            point.setPosition( mouse.getPosition( mainWindow ).x + point.getRadius() - point.getGlobalBounds().width, mouse.getPosition( mainWindow).y + point.getRadius() - point.getGlobalBounds().height );
            mainWindow.draw( point );
        }

        shape.setPointCount( leftButtonPressed?points.size() / 2 + 1:points.size() / 2 );
        for( int i = 0; i < points.size() / 2; ++i )
        {
            shape.setPoint( i, Vector2f( points[ i * 2 ], points[ i * 2 + 1 ] ) );
            point.setPosition( points[ i * 2 ] - point.getRadius(), points[ i * 2 + 1 ] - point.getRadius() );
            mainWindow.draw( point );
        }
        if( leftButtonPressed )
            shape.setPoint( shape.getPointCount() - 1, Vector2f( mouse.getPosition( mainWindow ).x, mouse.getPosition( mainWindow ).y ) );
        mainWindow.draw( shape );

        mainWindow.display();
    }

    return 0;
}

Otóż program działa ładnie

Dodając kolejny wierzchołek też jest ładnie
Próbując wielokątów wklęsłych (czyli tam gdzie podejrzewałem że coś pójdzie nie tak) wszystko jest pozornie dobrze


Problem zaczyna się gdy ten kąt jest troszeczkę większy

(ten jaśniejszy zielony jest dlatego że dwa kolory RGB(0, 255, 0) z kanałem alpha na siebie nachodzą)

Co można z tym zrobić żeby ta figura faktycznie składała się z połączonych punktów? I dlaczego ta figura na obrazku wyżej jest narysowana w ten sposób?

1 odpowiedź

+2 głosów
odpowiedź 2 grudnia 2018 przez niezalogowany
wybrane 5 grudnia 2018 przez Daaa22
 
Najlepsza

sf::ConvexShape służy jak nazwa wskazuje tylko do rysowania wielokątów wypukłych. SFML nie definiuje jak zostanie narysowany wielokąt wklęsły. Możesz sam go zaimplementować używając boost.geometry, łącząc właściwości kilku sf::ConvexShape, lub najprościej użyć jakiegoś gotowego rozwiązania np thor::ConcaveShape.

Podobne pytania

0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 10 października 2018 w HTML i CSS przez KingOfTheNorth Nowicjusz (180 p.)
0 głosów
3 odpowiedzi 240 wizyt
pytanie zadane 10 listopada 2015 w HTML i CSS przez marks-maks Początkujący (430 p.)
0 głosów
4 odpowiedzi 1,509 wizyt
pytanie zadane 9 października 2015 w HTML i CSS przez marks-maks Początkujący (430 p.)

92,565 zapytań

141,417 odpowiedzi

319,600 komentarzy

61,950 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...