Schrift
[thread]7045[/thread]

rotationsmodul in perl?



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
supersucker
 2005-06-09 21:20
#55442 #55442
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Hi zusammen,

gibt es ein Mathemodul für perl mit dem ich rotationen eines punktes um einen anderen anhand eines winkels berechnen lassen kann (in einem dreidimensionalen kartesischen koordinatensystem)?
ich suche eine funktion in einem modul, die als eingabe erwartet:

- die koordinaten des punktes um den herum der andere rotiert werden soll
- die koordinaten des punktes der rotiert werden soll
- der winkel um den herum rotiert werden soll

und die mir als ausgabe die neuen koordinaten des rotierten punktes zurückgibt.

eine google-suche nach "perl module rotation" und ähnliches war nicht erfolgreich und bei cpan bin ich auch nicht fündig geworden.
wenn ich bei der cpan suche "rotation" oder "math rotation" oder nur "math" eingebe krieg ich mehr als tausend hits....

kennt einer von euch ein modul was mir weiterhelfen würde?

danke im voraus....
pKai
 2005-06-09 21:53
#55443 #55443
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
CPAN:Math:SO3 könnte hilfreich sein.
I sense a soul in search of answers.
supersucker
 2005-06-10 18:40
#55444 #55444
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
erstmal danke für den tip, das modul scheint wirklich das zu machen was ich möchte

jetzt steh ich aber vor einem anderen problem:

die dokumentation zu dem modul ist absolut besch....

ein kleiner auszug von der manpage
Code: (dl )
1
2
3
$rotation=Math::SO3->new("zr" => 3.14159/2, 
"xr" => 3.14159/4,
"zr" => 3.14159/8);


Quote
Create a new SO3-rotation matrix.


und

Code: (dl )
1
2
$rotation->format_matrix();
$rotation->format_matrix("%16.8f");


Quote
Computes a string
"[[m00 m01 m02][m10 m11 m12][m20 m21 m22]]"
displaying the matrix elements. Optionally, a sprintf
format-string may be specified for the matrix
elements. Default is "%10.5f".


so weit, so gut, wenn das auch klappen würde, mach ich folgendes einfaches beispiel basierend auf dem was ich oben geschrieben habe:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use warnings;
use strict;

use Math::SO3;

my $rotation=Math::SO3->new("zr" => 3.14159/2,
"xr" => 3.14159/4,
"zr" => 3.14159/8);

$rotation->format_matrix("%16.8f");


erhalt ich überhaupt nichts als ausgabe, nicht mal eine fehlermeldung, das script läuft durch und ich krieg keine fehlermeldung.
desweiteren ist in der manpage (und das ist die einzigste informationsquelle die ich zu dem modul hab, weder über google noch über cpan hab ich mehr infos gefunden) nicht einmal beschrieben wie ich denn diese rotationsmatrix verwende, dazu steht nur:

Quote
Therefore, WE use the convention

(a1 ' ) ( ) (a1)
(a2 ' ) = ( M ) (a2)
(a3 ' ) ( ) (a3)


aber mit welcher speicherstruktur ich diese matrix multiplizieren kann, und was diese multiplikation zurückgibt wird nicht beschrieben. gehe ich mal von arrays aus

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use warnings;
use strict;

use Math::SO3;

my $rotation=Math::SO3->new("zr" => 3.14159/2,
"xr" => 3.14159/4,
"zr" => 3.14159/8);

my @arr = (23, 34, 45);
my @result = $rotation * @arr;

for (@result) {
print "\t $_ \n";
}


krieg ich lustigerweise genau eine zahl raus, das result-array enthält also genau eine zahl. aber es wird noch besser, diese zahl ändert sich auch noch bei jedem aufruf:

1. aufruf: 409054764
2. aufruf: 459128472
3. aufruf: 452714232

kann mir mit diesem modul jemand weiterhelfen? hat irgendjemand damit schon mal erfahrungen gesammelt? oder kennt jemand ein anderes modul, das das gleiche macht aber bedienbar ist und über eine ordentliche manpage verfügt?

danke im voraus

p.s.: oder könnte das an einer fehlerhaften installation liegen? als ich das modul installiert und ein

Code: (dl )
make test


ausgeführt hab, hat er 10 tests gemacht, 9 waren ok, einer nicht, welcher warum nicht ok war wurde nicht ausgegeben, aber installiert hat er das modul trotzdem ohne fehlermeldung
Dubu
 2005-06-11 18:57
#55445 #55445
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use warnings;
use strict;

use Math::SO3;

my $rotation=Math::SO3->new("zr" => 3.14159/2,
                          "xr" => 3.14159/4,
                          "zr" => 3.14159/8);
                         
$rotation->format_matrix("%16.8f");  


erhalt ich überhaupt nichts als ausgabe, nicht mal eine fehlermeldung, das script läuft durch und ich krieg keine fehlermeldung.

Ich sehe da kein print.

Quote
desweiteren ist in der manpage (und das ist die einzigste informationsquelle die ich zu dem modul hab, weder über google noch über cpan hab ich mehr infos gefunden) nicht einmal beschrieben wie ich denn diese rotationsmatrix verwende, [...]


Meinst du das hier?
Quote
$rotation->translate_vectors($vec1, $vec2,
                              $vec3, $vec4, @other_vectors);

   Destructively replace each single one of a list of
   cscv's by the corresponding cbcv's. Note that vectors
   must be packed-double-strings:
   $vec=pack("d3",$xcoord,$ycoord,$zcoord);

   Note: if vectors are "longer", say, like pack("d4", 5,8,10,1),
   only the first three coordinates will be replaced.
   This is very useful when working with homogenous coordinates.


Quote
gehe ich mal von arrays aus

"Packed double strings" sind es, s. Doku oben.
supersucker
 2005-06-13 05:50
#55446 #55446
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use warnings;
use strict;

use Math::SO3;

my $rotation=Math::SO3->new("zr" => 3.14159/2,
"xr" => 3.14159/4,
"zr" => 3.14159/8);

$rotation->format_matrix("%16.8f");


erhalt ich überhaupt nichts als ausgabe, nicht mal eine fehlermeldung, das script läuft durch und ich krieg keine fehlermeldung.

Ich sehe da kein print.


äh, sorry, hatte ich aus versehen nicht mit reingepastet
am ende hatte ich noch stehen:

Code: (dl )
print rotation;


darauf erhielt ich ein:

Code: (dl )
Math::SO3=SCALAR(0x870bf9c)

als ausgabe
ok, dann muss ich das ding dereferenzieren, dachte ich, hab also :

Code: (dl )
print $$rotation;

geschrieben, darauf erhielt ich ein:

Code: (dl )
6&�&�/uQ&#1151

und so weiter als ausgabe.

Quote
"Packed double strings" sind es, s. Doku oben.


@dubu: hast völlig recht, aber ich wollte mir das dumme ding erst mal einfach ausgeben lassen, ich möchte einfach sehen was in dieser matrix drinsteht

aber ich verstehs nicht, wie kann ich mir denn einfach nur die matrix ausgeben lassen? ich hab von referenzen und dereferenzierungen in perl nicht allzuviel ahnung, ich hab mir jetzt die doku nochmal durchgelesen, und entweder bin ich zu blöd zum lesen oder das steht wirklich nicht drin wie man sich die matrix ausgeben lassen kann, oder das ist total trivial und ich versteh nicht wie ich das ding richtig dereferenzieren muss um an die einzelnen elemente zu kommen (muss leider immer wieder feststellen das meine perl-kenntnisse nicht gerade berauschend sind..:-(.......)

auch mein kamel-buch bzw. online - tutorials haben mich nicht wirklich weitergebracht, ich versteh trotzdem nicht wie ich an die einzelnen elemente der matrix rankomme.............

kann mir da einer weiterhelfen?

danke im voraus.......
pKai
 2005-06-13 11:32
#55447 #55447
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Sollte nicht zumindest die Methode format_matrix einen lesbare Zeichenkette zurückliefern?
I sense a soul in search of answers.
Crian
 2005-06-13 11:46
#55448 #55448
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Wenn Du irgendwo "reingucken" willst, ist Data::Dumper ein heißer Tipp.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2005-06-13 13:07
#55449 #55449
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
$rotation->format_matrix("%16.8f"); gibt einen wert zurück, warscheinlich ist es das, was du willst.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
supersucker
 2005-06-13 15:34
#55450 #55450
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
@pkai
Quote
Sollte nicht zumindest die Methode format_matrix einen lesbare Zeichenkette zurückliefern?


ja, so hatte ich das auch verstanden, steht ja auch genauso in der doku, tut es aber nicht....

@Taulmarill
Quote
$rotation->format_matrix("%16.8f"); gibt einen wert zurück, warscheinlich ist es das, was du willst.


hmm, nein, damit kann ich ja nichts anfangen, die rotations-matrix ist (oder sollte..) eine 3 x 3 matrix sein mit demzufolge 9 einträgen

@Crian
Quote
Wenn Du irgendwo "reingucken" willst, ist Data::Dumper ein heißer Tipp.


danke für den hinweis, werd ich probieren...

hmm, perl wird im graphik-bereich kaum eingesetzt oder? also mit graphik-bereich mein ich nicht gui-geschichten sondern low-level-graphik routinen (genau für sowas braucht man z.b. solche rotationsmatrizen die eine beliebig freie drehung eines punktes um einen anderen erlauben)...anders kann ich mir nicht erklären, dass es nur ein modul für sowas in perl zu geben scheint, das darüberhinaus nicht mal das tut was es soll.....
Taulmarill
 2005-06-13 16:00
#55451 #55451
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
also, folgendes progeamm vorausgesetzt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use warnings;
use strict;

use Math::SO3;

my $rotation = Math::SO3->new(
"zr" => 3.14159 / 2,
"xr" => 3.14159 / 4,
"zr" => 3.14159 / 8
);

print $rotation->format_matrix("%16.8f");


bekomme ich folgende ausgabe:

Code: (dl )
[[     -0.27059679       0.92388002       0.27059765] [     -0.65328251      -0.38268226       0.65328114] [      0.70710631      -0.00000094       0.70710725]]


für mich sieht das nach 3x3 werten aus. aber was weiss ich schon ....
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2005-06-09 21:20.