CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Obracanie trójkąta
Strona 1 z 1

Obracanie trójkąta

Nowy postNapisane: sobota, 20 października 2012, 09:49
przez Cyfrowy Baron
Potrzebuję kodu na obracanie trójkąta, bo szczerze mówiąc nie chce mi się zaczynać tego od początku i pomyślałem, że może ktoś już coś takiego ma.

Re: Obracanie trójkąta

Nowy postNapisane: sobota, 20 października 2012, 16:38
przez polymorphism
Chodzi Ci o przeliczenie współrzędnych? Jeśli tak, to tu wystarczy przecież prosty wzór na obrót punktu na płaszczyźnie:

TeX: {x}'=x*\cos\beta-y*\sin\beta
TeX: {y}'=x*\sin\beta+y*\cos\beta

p.s. czemu nie działa LaTex?

Re: Obracanie trójkąta

Nowy postNapisane: sobota, 20 października 2012, 20:32
przez Cyfrowy Baron
Nic mi to nie mówi. To tylko dwa punkty X i Y a trójkąt ma trzy. Rysując trójkąt muszę przemieszczać 3 punkty zachowując ich wzajemne położenie względem siebie, a wartość każdego punktu musi wyrażać się w dwóch współrzędnych określających ich położenie na płaszczyźnie.

Re: Obracanie trójkąta

Nowy postNapisane: sobota, 20 października 2012, 21:03
przez polymorphism
Nic mi to nie mówi. To tylko dwa punkty X i Y a trójkąt ma trzy.

To nie są punkty, tylko współrzędne punktu P=(x, y). Te dwa wzory mają Ci posłużyć do wyliczenia współrzędnych punktu po obrocie o dany kąt względem początku układu. Trójkąt ma trzy wierzchołki, więc musisz dla każdego wykonać oddzielne obliczenia. Wszystko jasne?

Re: Obracanie trójkąta

Nowy postNapisane: sobota, 20 października 2012, 22:25
przez Cyfrowy Baron
W sumie to okazałeś się jednak pomocny chociaż wzór wymagał drobnej korekty do moich potrzeb. Na razie udało mi się obracać linię tak jak wskazówkę zegara, więc myślę, że pociągnięcie linii między tymi dwoma punktami będzie już proste.

Tak wygląda kod:

KOD cpp:     UKRYJ  
void __fastcall DrawLine(TCanvas *myCanvas, TPoint p1, TPoint p2)
{
 myCanvas->MoveTo( p1.x, p1.y );
 myCanvas->LineTo( p2.x, p2.y );
}
//---------------------------------------------------------------------------
TPoint p2 = TPoint(60, 80);

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 float s = (2.0 * 3.14) / 360.0;

 static float k = 0; //kąt
 k += 5;

 int x = p1.x + 30 * cos(k * s);
 int y = p1.y + 30 * sin(k * s);

 DrawLine(Image1->Canvas, TPoint(x, y), TPoint(p1.x, p1.y) );
}


A tak efekt działania:

angle.png

Re: Obracanie trójkąta

Nowy postNapisane: poniedziałek, 22 października 2012, 10:20
przez Mironas
Ja kiedyś zrobiłem to tak:
KOD cpp:     UKRYJ  
void TForm1::PrzesunPunktWgObrotu(int & X, int & Y, int sx, int sy, int obrot)
{
        // Przesuniecie punktow do pozycji 'po obrocie'
        //    X,Y               - pozycja punktu
        //    sx,sy             - srodek obrotu
        // --------------------------------------------
        double AlphaRad = (double)obrot * M_PI / -180.0;
        float px, py;   // zmienne pomocnicze

        double COS = cos(AlphaRad);
        double SIN = sin(AlphaRad);

        float FX = X;
        float FY = Y;

        // przesuniecie srodka obrotu do poczatku ukladu wsp czyli o wektor (-XS,-YS)
        FX = FX - sx;
        FY = FY - sy;

        // obrot o kat Alpha wzgledem srodka obrotu
        px = FX * COS + FY * SIN;
        py = FY * COS - FX * SIN;

        // przesuniecie srodka obrotu z powrotem czyli o wektor (XS,YS)
        FX = px + sx;
        FY = py + sy;

        //
        X = FX;
        Y = FY;
}
 

Oczywiście dla trójkąta trzeba wykonać 3 razy - dla każdego wierzchołka oddzielnie.
Jeśli dobrze pamiętam to trzeba dodać:
#include <Math.hpp>