• 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

VPS Starter Arubacloud
0 głosów
229 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ź 142 wizyt
pytanie zadane 10 października 2018 w HTML i CSS przez KingOfTheNorth Nowicjusz (180 p.)
0 głosów
3 odpowiedzi 237 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,486 wizyt
pytanie zadane 9 października 2015 w HTML i CSS przez marks-maks Początkujący (430 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...