Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
harakiwi
Člen
Avatar
harakiwi:29.8.2014 10:57

Ahoj.

Narazil jsem během programování na jeden problém a rád bych vás poprosil, zda byste mi s ním nedokázali pomoci.

Mám třídu Shape:

class Shape
{
protected Point[] points;
public Point position = new Point(0,0,0);
protected float rotationX = 0;
protected float rotationY = 0;
protected float rotationZ = 0;

public Shape(Point[] points)
{
this.points = points;
}

public Point[] GetPointsRaw()
{
return points;
}

public Point[] GetPoints()
{
Point[] adjustedPoints = new Point[points.Len­gth];
points.CopyTo(ad­justedPoints,0);
return adjustedPoints();
}
}

Tvar, shape, je tvořen body, points

class Point
{
public float x;
public float y;
public float z;

public Point(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
}
}

V poli Point[] points jsou uloženy souřadnice bodů relativně (tj. v tomto případě k pozici [0;0;0] s nulovým natočením a tak je vrací metoda GetPointsRaw()).
Tím problémem je dopsání metody GetPoints(). Ta by totiž měla vrátit souřadnice absolutní, tj. vzhledem k pozici a především rotaci té dané instanci Shape.

Otočení v rovině pro mě není problém:
x'=x*cos(α) - y*sin(α)
y'=x*sin(α) - y*cos(α)

Horší už je to v prostoru. Wikipedia uvádí pro mě zatím nepochopitelné matice ( http://en.wikipedia.org/…(mathematics) ). Dokázal by, prosím, někdo napsat (alespoň pseudo-) metodu, jež by vracela souřadnice bodů v prostoru na základě jejich otočení kolem daného bodu?

 
Odpovědět
29.8.2014 10:57
Avatar
coells
Tvůrce
Avatar
Odpovídá na harakiwi
coells:29.8.2014 11:10

Rotace v prostoru je stejná, jako rotace v rovině:

// rotace okolo osy z
x'=x*cos(α) - y*sin(α)
y'=x*sin(α) - y*cos(α)
z'=z

// rotace okolo osy y
x'=x*cos(α) - z*sin(α)
y'=y
z'=x*sin(α) - z*cos(α)

// rotaci okolo osy x si domyslíš
 
Nahoru Odpovědět
29.8.2014 11:10
Avatar
harakiwi
Člen
Avatar
harakiwi:29.8.2014 12:07

A jó, máš pravdu! Děkuji za osvětu, ty matice mě dost strašily.

 
Nahoru Odpovědět
29.8.2014 12:07
Avatar
sadlomaslox25:29.8.2014 17:42

Me by ty matice taky vydesili zvlast kdyz v C# jde napsat

Point3D point = new Point3D(2, 2, 2);
RotateTransform3D rotation = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 2, 3), 30));
Point3D newPoint = rotation.Transform(point);
 
Nahoru Odpovědět
29.8.2014 17:42
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:29.8.2014 20:08

Matice pro transformace jsou právě to nejlepší, co vymysleli. V programování to ušetří řádově několikrát operací. Na každý bod počítate sinus a kosinus jednou, v maticích je to už vypočítané předem, takže se jen násobí.

 
Nahoru Odpovědět
29.8.2014 20:08
Avatar
Neaktivní uživatel:13.9.2014 19:33

formula spravna nie je cos(uhol)-sin(uhol) a sin(uhol)-cos(uhol) ale cos(uhol)-sin(uhol) & sin(uhol) "+" cos(uhol)

Nahoru Odpovědět
13.9.2014 19:33
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.