 |
|
 |
|
 |
 |
|
|
|
|
|
|
| 막상 3D 상의 임의의 세 점으로 구성된 삼각형의 넓이를 구하려고 하면 좀처럼 마땅한 방법이 떠오르지 않는다. 여기에 비교적 간단한 방법으로 공간상의 삼각형 넓이를 구하는 방법을 소개한다
공간상의 두 벡터 P,Q 가 주어졌을때, 외적(cross product) 은 다음의 식을 만족한다.
위식의 우변을 잘 살펴보면 외적 PxQ 의 크기가 P와 Q에 의해 만들어지는 평행사변형의 넓이와 같음을 알수 있다. 이를 이용하면 꼭지점이 P,Q,R 인 임의의 삼각형의 넓이A를 다음과 같은 식에 의해 계산할 수 있다.
예를 들어 P(4, 2, -1), Q(-1, 4, 2), R(2, 1, -4) 같이 세점으로 구성된 삼각형 넓이를 구해보면,
PQ = [-1 - 4]i + [4- 2]j + [2- (-1)]k = -5i +2j + 3k.
PR = [2 - 4]i + [1 - 2]j + [-4 - (-1)]k = -2i - j - 3k.
PQ X PR = <2*(-3)-3*(-1) , 3*(-2)-(-5)*(-3) , (-5)*(-1)-2*(-2)> = <-3,-21,-1>
A=1/2 * sqrt( (-3)*(-3) + (-21)*(-21) + (-1)*(-1) ) = 10.618
|
|
| 이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/94 |
|
|
|
|
|
|
|
| 동적으로 여러개의 MovieClip 을 원형으로 배열할때 직교좌표계 사용하는 것보다 극좌표계를 사용하면 훨씬 다루기가 쉽다. 또한 x,y 와 같은 점을 다룰경우 Point 클래스를 이용하면 각 점간의 수학적인 연산에 있어 기본적으로 Point 클래스의 메서드를 이용하여 쉽게 처리할 수 있다.
극좌표를 직교좌표로 바꿀때도 기본으로 제공해주는 메서드를 사용하면 된다.
polar (Point.polar method) public static polar(len: Number, angle: Number) : Point
Converts a pair of polar coordinates to a Cartesian point coordinate.
Parameters len: Number - The length coordinate of the polar pair. angle: Number - The angle, in radians, of the polar pair.
Returns Point - The Cartesian point.
import flash.geom.Point;
var len:Number = 125; var angleInRadians:Number ; var cartesianPoint:Point var unitAngle:Number=15;
for(var i=1 ; i<=24 ; i++){ var mc:MovieClip=this.attachMovie("M_thumb"+i,"M_thumb"+i,i); angleInRadians = Math.PI*unitAngle/180*(i-1);
cartesianPoint = Point.polar(len, angleInRadians); // 극 좌표를 직교좌표로 전환 var offsetX:Number=Math.round(cartesianPoint.x); var offsetY:Number=Math.round(cartesianPoint.y); mc._x=Stage.width/2+offsetX; mc._y=Stage.height/2+offsetY; }
굳이 point 클래스를 사용하지 않고서도 극좌표계를 직교좌표계로 간단한 삼각함수를 사용하여 다음과 같이도 쉽게 바꿀수 있다.
x1=x0+(Math.cos(angle)*radius); y1=y0+(Math.sin(angle)*radius);
하지만 Point 클래스를 사용하여 좌표를 구성한다면 코드의 일관성에 있어서나 간결성에 있어 상당한 도움이 될것이다.
|
|
| 이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/89 |
|
|
|
|
|
|
|
| 조절점이 3개일 경우 일반 베지에 곡선의 일반식
B(u) = P0 * ( 1 - u ) 2 + P1 * 2 * u ( 1 - u ) + P2 u2
을 이용하면 단순히 베지에 곡선을 그리는 것으로 끝나는 것이 아니라 각 포인트를 추적할 수 있다.
플래시에서 제공하는 curveTo 메서드도 물론 위 공식에 의한 계산으로 곡선을 그리는 것이지만
그리는것 이상의 것은 할 수 없었다.
function bezierPoint(mc:MovieClip,t:Number){
var x = ( 1 - t ) * ( 1 - t ) * mc.p1._x + 2 * t * ( 1 - t ) * mc.p2._x + t * t * mc.p3._x;
var y = ( 1 - t ) * ( 1 - t ) * mc.p1._y + 2 * t * ( 1 - t ) * mc.p2._y + t * t * mc.p3._y;
mc.point_mc._x=x;
mc.point_mc._y=y;
}
control point 와 anchor point 를 지정해 곡선을 그리고 더 나아가 그린 곡선위의 포인트를 계산에 의해 추적이 가능하다. 즉, 스크립트로 모션이 가능하다.
|
|
| 이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/28 |
|
|
|
|
|
|
|
| 3차원 공간에 있는 N+1개의 조절점(control point) pk (k=0,1,...,N)를 생각해봅시다. 베지어 parametric 곡선 공식은 다음과 같습니다. 
B(u)는 서로 다른 위치에 있는(discrete) N개의 조절점에 의해 얻어지는 곡선을 구하기 위한 연속함수입니다. u=0이면 첫번째 조절점(k=0)에, u=1이면 마지막 조절점(k=N)에 도달합니다. 아래는 N=4, 즉 조절점이 4개인 경우의 곡선 모습입니다.
역자 주 : 첫번째 조절점이 시작점, 마지막 조절점이 끝점이라고 생각하시면 쉽겠죠? ^_^
그리고, N개의 조절점이 아니라 N+1의 조절점이라고 해야 하는 듯.
나중에 나오지만, 조절점의 위치가 모두 각각 다를 필요는 없습니다.

주의점:이 베지어 곡선은, 조절점 중 처음과 끝 점을 빼고는 보통 어느 조절점과도 만나지 않습니다. 공식을 사용하면 B(0) = P0 이고 B(1) = PN 이 되겠지요. 곡선은, 항상 조절점으로 이루어진 다각형 안에 들어가게 됩니다. 곡선이 조절점들 사이에서 크게 벗어나거나 하는 일은 없습니다. 조절점이 P0 하나뿐이라면, 즉 N=0 이라면 모든 u에 대해 B(u) = P0 입니다. (역자 주 : u는 0이상 1 이하의 실수) 조절점이 P0 , P1 두개뿐이라면, 즉 N=1이라면 이 공식은 두 점 사이를 잇는 선분을 만들어냅니다.


라는 부분은 blending 함수라고 하는데, 이 부분에서 조절점들을 blend해서 곡선을 생성하기 때문입니다. blending 함수는 조절점의 갯수보다 차수가 하나 낮은 다항함수입니다. 예를 들어, 3개의 조절점이 있다면 베지어 곡선은 포물선을 그리고, 4개의 조절점으로는 3차곡선을 얻게 됩니다. 첫번째 조절점의 위치와 마지막 조절점의 위치가 같을 경우 폐곡선이 생깁니다. 이때 처음의 두 조절점 사이의 접선(tangent)과 끝의 두 조절점의 접선이 같을 경우, first order continuity가 가능합니다. (역자 주 : P0 - P1 간의 기울기와 PN-1 - PN 간의 기울기가 같을 경우..라고 보시면 되겠습니다. first order continuity는, 두 곡선의 (1계)도함수가 같은, 즉 접선의 기울기가 서로 같은 상태를 의미합니다.)
비슷한 위치에 여러 조절점이 있을 경우, 그쪽으로 베지어 곡선을 "당기는" 정도가 증가합니다.

조절점의 갯수가 많아지면, 좀더 높은 차수의 식과, 많은 횟수의 팩토리얼 값을 계산해야 합니다. 그래서 보통 긴 곡선을 만들 때는, 그 곡선을 다시 여러 곡선으로 작게 쪼개는 방법을 씁니다. 이렇게 하면, 전체적인 모습에 변화를 주지 않고도 곡선의 부분적인 형태를 쉽게 바꿀 수 있는 효과도 얻게 됩니다. 물론 곡선이 첫번째 조절점에서 시작해서 마지막 조절점에서 끝나기 때문에, (나눠진) 곡선 조각들을 이어붙이기는 쉽습니다. 또한 베지어 곡선에서는 마지막 점에서의 접선이 마지막 두 조절점을 이은 선과 같기 때문에, (나누어진 곡선들의) 첫번째 조절점의 기울기도 맞출 수 있습니다.
Second order continuity는 보통 불가능합니다. (역자 주 : Second order continuity는, 이계도함수의 값이 같을 때의 상태입니다. 즉, 곡선의 변화율이 같다는 뜻입니다.)

조절점이 2개인 특수한 경우(직선)을 제외하고는, 한 베지어 곡선에 평행한 다른 베지어 곡선을 유도(derive)해내는 것은 불가능한 것으로 알려져 있습니다. 베지어 곡선으로 원을 완벽하게 표현할 수는 없습니다. coincident parallel curves나 직선인 베지어 곡선의 경우를 제외하고는, 한 베지어 곡선에 평행한 베지어 곡선을 만드는 것은 불가능합니다. 조절점이 3개일 경우는 공식이 다음과 같이 정리됩니다 :
B(u) = P0 * ( 1 - u ) 2 + P1 * 2 * u ( 1 - u ) + P2 u2 조절점이 4개일 경우는 공식이 다음과 같이 정리됩니다 :
B(u) = P0 * ( 1 - u )3 + P1 * 3 * u * ( 1 - u )2 + P2 * 3 * u2 * ( 1 - u ) + P3 * u3
|
|
| 이 글의 관련글(트랙백) 주소 :: http://kimkijeung.com/trackback/27 |
|
|
|
|
|
 |
|
|