błędy w grafice windows?

błędy w grafice windows?

Wątek przeniesiony 2021-02-22 22:19 z C/C++ przez kq.

kwalifika
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 4 lata
  • Postów:125
0

Rysuję sobie zwyczajny prostokąt za pomocą Polygon,
i to wychodzi do bani - obgryzione narożniki:

screenshot-20210222221044.png

i co to ma być?!
Przez 30 lat nie potrafią takich prostych bagów poprawić, czy jak?

edytowany 1x, ostatnio: kwalifika
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 godziny
  • Postów:6694
0

Może wsteczna kompatybilność :] ?

Poza tym pokaż jak wywołujesz tą funkcję, ze wszystkimi parametrami.


🕹️⌨️🖥️🖱️🎮
abrakadaber
abrakadaber
  • Rejestracja:prawie 13 lat
  • Ostatnio:9 miesięcy
  • Postów:6610
0

ewidentnie widać, że zaczynasz/kończysz 1 pixel za daleko/blisko


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
kwalifika
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 4 lata
  • Postów:125
0

Prostokąty rysujemy tak:
a,b,c,d -> (a,b) i (c,d) dwa punkty po przekątnej;

zatem aby to chlapnąć polygonem robimy tak:

TPoint p[4];

 p[0].x = a; p[0].y = b;
 p[1].x = c; p[1].y = b;
 p[2].x = c; p[2].y = d;
 p[3].x = a; p[3].y = d;

// p[4].x = a; p[4].y = b; // to nic nie daje, bo polygon jest z definicji figurą zamkniętą (do linii jest Polyline);

Polygon(dc, p, 4);

i jest do bani: narożnik nadgryziony.
No, ale wiadomo że Windows wprodukowali amatorzy.

jarekr000000
Windows wprodukowali amatorzy. - nie ma obowiązku korzystania z Windows.
Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 godziny
  • Postów:6694
0

🕹️⌨️🖥️🖱️🎮
kwalifika
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 4 lata
  • Postów:125
0

Bo ja potrzebuję niekiedy obracać te prostokąty, więc Rectangle odpada.

masz ten prostokąt: a, b, c, d;

i chcemy go obrócić o 30 stopni, więc wystarczy przeliczyć:
p = R(30) * (x,y); // gdzie: R(f) to macierz obrotu.

Polygon(dc, p, 4); // i gotowe!

Stefan_3N
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 miesiące
  • Postów:145
1

Obrys Twojego prostokąta jest grubszy niż 1 piksel.
Stąd wnoszę, że użyłeś CreatePen, aby utworzyć taki (grubszy) pen.
Pen tworzony za pomocą CreatePen ma zawsze zaokrąglone końcówki. Przy dwóch pikselach tego nie widać, ale gdybyś dał większą grubość, to nie miałbyś "wyżarcia", tylko narożniki zaokrąglone. Przy grubości 2 - tak mu wychodzi to zaokrąglenie.

Żeby mieć narożniki prostokątne, trzeba użyć ExtCreatePen
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-extcreatepen
z PS_ENDCAP_SQUARE|PS_JOIN_MITER.

Do obracania:
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setworldtransform
Zwróć uwagę, że to działa tylko w trybie GM_ADVANCED
https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setgraphicsmode


kwalifika
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 4 lata
  • Postów:125
0

Możliwe, ale to jest i tak bug.

Po obrocie tego nie widać.
rbug.gif

Spine
  • Rejestracja:około 22 lata
  • Ostatnio:około 2 godziny
  • Postów:6694
1

A to, że nie wygładza krawędzi ukośnych linii to też bug, czy po prostu użyłeś za mało instrukcji WinAPI?
Wiesz, że to API nie ma być idiotoodporne i właśnie dlatego jest takie szybkie? Nie robi za programistę żadnych nadmiarowych operacji.
Trzeba konkretny problem rozwiązać w konkretny sposób.

Jeśli chcesz bibliotekę, która część pracy wykona za Ciebie, to użyj Qt. https://doc.qt.io/qt-5/qpainter.html#details


🕹️⌨️🖥️🖱️🎮
edytowany 1x, ostatnio: Spine
kwalifika
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 4 lata
  • Postów:125
0

GDI jest deklarowane jako 'per piksel perfekt', zatem ja pokazuję że wcale tak nie jest.

QT możesz sobie np. w ubikacji użyć - do barwienia papieru... :)

edytowany 1x, ostatnio: kwalifika
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:minuta
0
kwalifika napisał(a):

Rysuję sobie zwyczajny prostokąt za pomocą Polygon,

i to wychodzi do bani - obgryzione narożniki:
i co to ma być?!

  1. pokaż kod.

@kq dlaczego to trafiło do flame'a? Bez sensu, zaśmiecanie flame'a merytorycznymi tematami…

edytowany 1x, ostatnio: Azarien
Zobacz pozostałe 2 komentarze
kwalifika
Koniowi to powiedz: kompilatory nadal nie potrafią robić efektywnie konwersji float na int: fld/fstpi;
AT
@kwalifika: W takim razie zaimplementuj konwersję float na int w asemblerze najefektywniej jak potrafisz, porównaj to z kodem wygenerowanym przez kompilator z włączonymi optymalizacjami i zobaczymy co działa szybciej.
kwalifika
już dawno gotowe: fld float; fstpi int; a to co generują kompilatory nie mieści w pale - z 20 instrukcji! pomijam sse40 bo tego i tak żaden kompilator nie ogarnia.
kq
bo to troll. Zresztą pierwszy post nadaje się na przeniesienie albo tu albo do kosza
kwalifika
a ty pitol jesteś.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.