1 2 3 4 5 6 7 8 9 10 11 12
# rotate ($x, $y, $angle_in_radians) => ($new_x, $new_y) sub rotate { my ($x, $y, $angle) = @_; my $len = sqrt($x*$x + $y*$y); $angle += atan2($y, $x); return $len * cos($angle), $len * sin($angle); }
2011-05-10T14:50:58 MatthiasW[...]
IMHO kann man da aber auch eine eigene kleine Funktion schreiben:
[...]
1 2 3 4 5
sub rotate { my ($x, $y, $r) = @_; my ($s, $c) = (sin($r), cos($r)); return ($c*$x - $s*$y, $s*$x + $c*$y); }
1
2
3
4
5
sin(a+b)=sin(a)*cos(b)+cos(a)*sin(b)
cos(a+b)=cos(a)*cos(b)-sin(a)*sin(b)
x/h=sin(a)
y/h=cos(a)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
x2=sin(a+b)*h
y2=cos(a+b)*h
=>
x2=(sin(a)*cos(b)+cos(a)*sin(b))*h
y2=(cos(a)*cos(b)+sin(a)*sin(b))*h
=>
x2=(x1/h*cos(b)+y1/h*sin(b))*h
y2=(y1/h*cos(b)-x1/h*sin(b))*h
=>
x2=x1*cos(b)+y1*sin(b)
y2=y1*cos(b)-x1*sin(b)