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

błędy w grafice windows?

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?

0

Może wsteczna kompatybilność :] ?

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

0

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

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.

0

A dlaczego do prostokąta nie użyjesz https://docs.microsoft.com/en[...]pi/wingdi/nf-wingdi-rectangle ?

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!

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[...]wingdi/nf-wingdi-extcreatepen
z PS_ENDCAP_SQUARE|PS_JOIN_MITER.

Do obracania:
https://docs.microsoft.com/en[...]i/nf-wingdi-setworldtransform
Zwróć uwagę, że to działa tylko w trybie GM_ADVANCED
https://docs.microsoft.com/en[...]gdi/nf-wingdi-setgraphicsmode

0

Możliwe, ale to jest i tak bug.

Po obrocie tego nie widać.
rbug.gif

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

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... :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0