Diskuze: Rotace bodů v prostoru

C# .NET .NET (C# a Visual Basic) Rotace bodů v prostoru American English version English version

Avatar
harakiwi
Člen
Avatar
harakiwi:

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/wiki/Rotation_(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
Redaktor
Avatar
Odpovídá na harakiwi
coells:

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  +1 29.8.2014 11:10
Avatar
harakiwi
Člen
Avatar
harakiwi:

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:

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:

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:

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.