Próbuję stworzyć grę karcianą, w której karty się rozkładają. W tej chwili do wyświetlenia używam API Allegro, które ma funkcję:
al_draw_rotated_bitmap(OBJECT_TO_ROTATE,CENTER_X,CENTER_Y,X
,Y,DEGREES_TO_ROTATE_IN_RADIANS);
więc dzięki temu mogę łatwo uzyskać efekt wachlarza. Problem polega na tym, aby wiedzieć, która karta jest pod myszą. Aby to zrobić, pomyślałem o wykonaniu testu zderzenia wielokątów. Po prostu nie jestem pewien, jak obrócić 4 punkty na karcie, aby utworzyć wielokąt. Zasadniczo muszę wykonać tę samą operację co Allegro.
na przykład 4 punkty na karcie to:
card.x
card.y
card.x + card.width
card.y + card.height
Potrzebowałbym funkcji takiej jak:
POINT rotate_point(float cx,float cy,float angle,POINT p)
{
}
Dzięki
Jeśli obrócisz punkt
(px, py)
wokół punktu(ox, oy)
o kąt theta, otrzymasz:p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy
jest to łatwy sposób na obrócenie punktu w 2D.
źródło
Układ współrzędnych na ekranie jest lewoskrętny, tzn. Współrzędna x rośnie od lewej do prawej, a współrzędna y od góry do dołu. Początek O (0, 0) znajduje się w lewym górnym rogu ekranu.
Do ruchu wskazówek zegara obrót dookoła punktu początkowego w punkcie o współrzędnych (x, y) jest wyrażona przez następujące równania:
gdzie (x ', y') to współrzędne punktu po obrocie i kąt theta, czyli kąt obrotu (należy podać w radianach, czyli pomnożone przez: PI / 180).
Aby wykonać obrót wokół punktu innego niż punkt początkowy O (0,0), powiedzmy punkt A (a, b) (punkt obrotu). Najpierw tłumaczymy obrócony punkt, tj. (X, y) z powrotem do punktu początkowego, odejmując współrzędne punktu obrotu (x - a, y - b). Następnie wykonujemy obrót i otrzymujemy nowe współrzędne (x ', y'), a na końcu dokonujemy translacji punktu z powrotem, dodając współrzędne punktu obrotu do nowych współrzędnych (x '+ a, y' + b).
Zgodnie z powyższym opisem:
a obrót punktu (x, y) w kierunku zgodnym z ruchem wskazówek zegara theta wokół punktu (a, b) wynosi:
Używając prototypu funkcji: (x, y) -> (px, py); (a, b) -> (cx, cy); theta -> kąt:
źródło
Obrót w prawo:
Obrót w lewo:
źródło
c
is
?c = cos(angle)
To jest odpowiedź Nilsa Pipenbrincka, ale zaimplementowana w c # fiddle.
https://dotnetfiddle.net/btmjlG
Ps: Najwyraźniej nie mogę komentować, więc mam obowiązek zamieścić to jako odpowiedź ...
źródło