2010-06-05 9 views
2

일련의 점이 주어지면 어떻게 5 픽셀 떨어진 선에 대한 벡터를 계산할 수 있습니까? 예는 : 감안할 때 :N 너비 선 그리기?

\ 
    \ 
    \ 

어떻게 오른쪽에

\ \ 
    \ \ 
    \ \ 

것들은위한 벡터를 찾을 수 있습니다.

저는 플래시와 같은 프로그램이 두껍게 윤곽선을 그릴 수있는 방법을 알아 내려고하고 있습니다.

감사

+1

벡터는 언제나 정의에 따라 멋진 직선입니다 ... 길이가 무척 길고 멋진 직선입니다. 또한, 어떤 방향으로 5 픽셀입니까? 오른쪽으로? 첫 번째 줄에 평범한가? –

+0

이 숙제 또는 개인 프로젝트입니까? –

+0

원래 일련의 선분이 단순한 수직 선이 아니라면 무엇을하고 싶습니까? – SamB

답변

8

두꺼운 선은 다각형입니다.

picture http://img39.imageshack.us/img39/863/linezi.png

시작 = 라인 시작 = 벡터 (X1, Y1)
끝 = 라인 끝 = 벡터 (X2, Y2)
DIR = 선 방향 = 끝 (의 지금은 앤티 엘리 어싱을 잊어 보자) - = 벡터 (X2-X1, Y2-Y1)
NDIR 시작 = 정규화 방향 DIR = 1.0 */길이 (DIR)
범인 = 수직 방향의 벡터 = (dir.x, -dir.y)에
nperp = 정규화 된 수직 = perp * 1.0/길이 (perp)

,210

perpoffset = nperp * w 0.5
diroffset = NDIR * w 0.5

(쉽게 한 정규화를 분리하고 서로 직교 취함으로써 오프셋을 계산할 수있다)

P0, P1을 P2, P3 = 다각형 점수
P0 = + perpoffset 시작 - diroffset
P1 = 시작 - perpoffset - diroffset을
단부 P2 = + + perpoffset diroffset
P3 = 엔드 - perpoffset + diroffset

P. 너 내가이 물건을 설명 할 마지막 사람이야. 이러한 것들은 직관적 인 수준에서 이해해야합니다.

+1

+1 예쁜 그래픽. –

+0

+1! 좋은 대답. – Alerty

+0

대단히 고맙습니다. 고등학교 때 Alegebra 1과 2와 Physics를 복용 함에도 불구하고이 설명에 진심으로 감사드립니다. – jmasterx

1

직선으로 수행하는 방법은 원래 라인 (N)의 수선을 발견하는 방향으로 5 개 픽셀 공정을 한 후 그 지점에서 수직으로 직각을 찾는 것이다

|  | 
--+-----+---N 
    |  | 
    |  | 

이 아닌 직선으로 그것을 할 방법은 많은 직선으로 근사하는 것입니다 또는 라인의 분석 표현이있는 경우, 것과 유사한 방식으로 분석 솔루션의 일종을 찾기 위해 직선의

0

수학 배경이 있어야합니다.

line (선형 방정식 및 선형 함수)을 이해하고 parallel은 무엇이며 기하학을 찾는 것이 좋습니다 transformations.

그 후 SigTerm의 답변을 이해하게 될 것입니다 ...

1

이 안된 의사 코드를 사용해보십시오 :

# Calculate the "Rise" and "run" (slope) of your input line, then 
# call this function, which returns offsets of x- and y-intercept 
# for the parallel line. Obviously the slope of the parallel line 
# is already known: rise/run. 

# returns (delta_x, delta_y) to be added to intercepts. 
adjacent_parallel(rise, run, distance, other_side): 
    negate = other_side ? -1 : 1 
    if rise == 0: 
     # horizontal line; parallel is vertically away 
     return (0, negate * distance) 
    elif run == 0: 
     # vertical line; parallel is horizontally away 
     return (negate * distance, 0) 
    else: 
     # a perpendicular radius is - run/rise slope with length 
     # run^2 + rize^2 = length^2 
     nrml = sqrt(run*run + rise*rise) 
     return (negate * -1 * run/nrml, negate * rise/nrml) 

SIGTERM 그의 멋진 그림에서 보듯이, 당신이 의도 한 라인의 양쪽에 줄을 얻고 싶은 것 : 그래서 거리를 thickness/2에 전달하고 두 번 호출 , 한 번 other_side=true으로하고, '추상 선'을 중심으로 두께를 그립니다.