2014-09-05 9 views
3

현재 두꺼운 폴리선 그리기 프로젝트를 진행 중이고 OpenGL에서 보간법을 사용하고 있습니다. 나는 필요한 모든 포인트를 계산할 수 있었지만 포인트를 두 개 더 뽑을 필요가있다. 한 지점을 두 지점을 연결하는 선에 직각으로 변환해야합니다. 아래의 스케치는 포인트가 무엇인지 보여줍니다. 점 L은 AB와 직각으로 L과 nJ 사이의 거리로 변환됩니다 (B는 중심 점임). 비슷한 것은 nK로 번역 된 것입니다.라인과 직교 좌표 변환

float alpha = atan2(B.y - A.y,B.x - A.x) - deg90; 
float alpha2 = atan2(C.y - B.y, C.x - B.x) - deg90; 


nJ.x = L.x + w*cos(alpha); // w is distance between A1 and A2 
nJ.y = L.y + w*sin(alpha); 
nK.x = L.x + w*cos(alpha2); 
nK.y = L.y + w*sin(alpha2); 

코드는 모든, 몇 가지 포인트 만 작동합니다

enter image description here

나는 코드를 작성했습니다. 위의 nJ와 nK 계산에서 노래를 고쳐야하지만 어떻게해야할지 모르겠다. 누구 제안? 이 벡터 시계 반대 방향으로 90도 회전

lhs(v) = [-v.y, v.x] 

:

답변

1

먼저 당신이 왼쪽 측면 기능이 필요합니다. 당신이 u에서 vw에에 폴리 라인이있는 경우

turn(u, v, w) = sign(lhs(v - u), w - v) 

, turn(u,v,w) 그것이 좌회전 (반 시계 방향으로 회전) (긍정적), 우회전의 여부를 알려줍니다

이제 회전 기능이 필요합니다 (시계 방향 돌림) (음수) 또는 동일 직선 (0).

abbc과 평행하게 이어지는 네 개의 무한 라인이 그림에서 각 쌍 사이에 w입니다. 하부에

의 선은 다음과 같습니다

f(s) = (a + 0.5 * w * normalize(lhs(b - a))) + (b - a) * s 
g(t) = (b + 0.5 * w * normalize(lhs(c - b))) + (c - b) * t 

당신은 두 줄의 교차점을 찾으려면; 즉, stf(s) = g(t)에 풀면됩니다. 이것은 두 개의 미지수가있는 두 선형 방정식의 시스템에 불과합니다.

해결책은 그림에있는 포인트 L = f(s) = g(t)입니다.

f(s) = (a - 0.5 * w * normalize(lhs(b - a))) + (b - a) * s 
g(t) = (b - 0.5 * w * normalize(lhs(c - b))) + (c - b) * t 

I = f(s) = g(t)에 대한 해결 :

는 동일한 아이디어를 사용할 수 I 계산합니다. 당신이 L가 있으면 다음과 같이

업데이트

당신은 KnJn을 계산할 수 있습니다. 항상 잘못은 아니지만, 일반적으로 잘못 - 계산 기하학 코드에서

Kn = L - w * normalize(lhs(b - a)) 
Jn = L - w * normalize(lhs(c - b)) 

는, 삼각 함수는 일반적으로 코드 냄새입니다. 선형 대수학을 계속 사용하십시오.

+0

이것은 철저한 대답 이었지만 내 질문에는 해당되지 않았습니다. 내가 포인트 A1, A2, C1, C2, J, K, I 및 L을 가지고 있다고 말했듯이 계산할 필요가있는 것은 Jn (코드 nJ에서)과 Kn입니다. –

+0

@M_global 질문의 문구가 분명하지 않았습니다 ...나는 그 부분으로 업데이트 할 것입니다 (그것은 쉽습니다). –

+0

탁신 이것은 매우 도움이되었고 내 질문이 맑지 않은 것이면 유감입니다. 다시 한 번 나는 당신이 제안한 것을 해 왔지만 그것은 일부만을위한 것이지 모든 것이 아닙니다. –