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

[SFML 2.X] Narzędzie Lasso w programie do edycji grafiki

Ostatnio zmodyfikowano 2025-09-06 17:18
Autor Wiadomość
pekfos
» 2025-09-02 16:39:37
Piksele wypadają poza RenderTexture. Zrób tą teksturę większą o 1px na szerokość i wysokość.
P-182951
tBane
Temat założony przez niniejszego użytkownika
» 2025-09-02 16:45:28
Ok. Tak zrobiłem ale jest jeszcze jeden bug. Rect z lewej strony jest za mały o 1px


P-182953
pekfos
» 2025-09-02 17:08:15
A od góry nie jest za mały? Zastanawiam się ile razy będziesz pytać o przypadki brzegowe wynikające z tego że ta tekstura jest robiona pod wymiar. Powinieneś być w stanie narysować piksele w rogach tej tekstury, (minX, minY), (maxX, maxY), itd. Jesteś w stanie to poprawnie zrobić? Liczysz te współrzędne, ale wymiar tekstury bierzesz z innego miejsca.
P-182957
tBane
Temat założony przez niniejszego użytkownika
» 2025-09-02 17:14:13
W tym przypadku co podałem u góry jest ok, lewo jest za mały o 1px, na dole jest za duży o 2px i po prawej jest za duży o 2px . Nie rozumiem skąd te rozbieżności.
// updateowałem repo

C/C++
void generateOutline( float scale ) {
   
if( points.size() < 3 ) return;
   
   
sf::VertexArray lines( sf::LineStrip );
   
   
for( auto & p: points )
       
 lines.append( sf::Vertex( sf::Vector2f( p ), sf::Color::White ) );
   
   
//lines.append(sf::Vertex(sf::Vector2f(points.front()), sf::Color::White)); // domknięcie
   
   
if( image != nullptr ) {
       
texture = sf::Texture();
       
texture.create( rect.getSize().x + 1, rect.getSize().y + 1 ); // dodałem te piksele i czytam z recta a nie z image->size()
       
texture.loadFromImage( * image );
       
       
       
mask.create( texture.getSize().x, texture.getSize().y );
       
mask.clear( sf::Color( 127, 47, 47, 127 ) );
       
sf::RenderStates rs;
       
rs.blendMode = sf::BlendNone;
       
//rs.transform.translate(0.5f,-0.5f);   // <<— kluczowe
       
mask.draw( lines, rs );
       
mask.display();
   
}
}
P-182958
tBane
Temat założony przez niniejszego użytkownika
» 2025-09-02 17:27:15
Próbuję zrobić tak by rect zaczynał i kończył się równo z punktami granicznymi

P-182960
tBane
Temat założony przez niniejszego użytkownika
» 2025-09-02 18:23:04
To chyba jest wina SFML a nie moja, bo chyba źle zaokrągla punkty :-/
P-182962
tBane
Temat założony przez niniejszego użytkownika
» 2025-09-03 11:52:16
Próbowałem też poprawiać zaznaczenie poprzez nowe obliczenie rectu na podstawie punktów w sf::VertexArray ale to również nie rozwiązało problemu.

C/C++
void generateOutline( float scale ) {
   
if( points.size() < 3 ) return;
   
   
sf::VertexArray lines( sf::LineStrip );
   
   
for( auto & p: points )
       
 lines.append( sf::Vertex( sf::Vector2f( p ), sf::Color::White ) );
   
   
lines.append( sf::Vertex( sf::Vector2f( points.front() ), sf::Color::White ) );
   
   
if( image != nullptr ) {
       
/*
  int left = std::numeric_limits<int>::max();
  int right = std::numeric_limits<int>::lowest();
  int top = std::numeric_limits<int>::max();
  int bottom = std::numeric_limits<int>::lowest();

  for (int i = 0; i < lines.getVertexCount();i++) {
   left = std::min(left, int(lines[i].position.x));
   right = std::max(right, int(lines[i].position.x));
   top = std::min(top, int(lines[i].position.y));
   bottom = std::max(bottom, int(lines[i].position.y));
  }

  int width = right - left;
  int height = bottom - top;

  rect = sf::IntRect(left, top, width, height);
  */
       
P-182963
tBane
Temat założony przez niniejszego użytkownika
» 2025-09-03 11:57:55
Teraz tak sobie przypomniałem, że również jak programowałem Edytor RPG2D to miałem podobny problem z sf::VertexArray - przesunięcie o 1 px i tworzyło to pionowe pasy.. Może ten sf::VertexArray jest skopany w SFML i zaokrągla punkty?
P-182964
1 2 « 3 » 4 5
Poprzednia strona Strona 3 z 5 Następna strona