2010-06-05 7 views
2

Étant donné une série de points, comment pourrais-je calculer le vecteur pour cette ligne de 5 pixels? Ex: Étant donné:Dessin de lignes de largeur N?

\ 
    \ 
    \ 

Comment pourrais-je trouver le vecteur pour

\ \ 
    \ \ 
    \ \ 

Ceux à droite. J'essaie de comprendre comment des programmes comme Flash peuvent faire des contours épais.

Merci

+1

Un vecteur est toujours, par définition, une belle ligne droite ... C'est même une ligne infiniment longue, belle, droite. Aussi, cinq pixels dans quelle direction? À droite? Le long de la normale à la première ligne? –

+0

S'agit-il de devoirs ou de projets personnels? –

+0

Que voudriez-vous que se produise si la série originale de segments de ligne n'était * pas * simplement une ligne verticale? – SamB

Répondre

8

Une ligne épaisse est un polygone. (Oublions anticrénelage pour l'instant)

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

start = ligne start = vecteur (x1, y1)
end = fin de ligne = vecteur (x2, y2)
dir = direction de la ligne = fin - start = vecteur (x2-x1, y2-y1)
NDIR = direction normalisée = dir * 1,0/longueur (dir)
perp = perpendiculaire à la direction = vecteur (dir.x, -dir.y)
nperp = perpendiculaire normalisée = perp * 1.0/longueur (perp)

perpoffset = nperp * w * 0,5
diroffset = NDIR * w * 0,5

(Vous pouvez facilement supprimer une normalisation et calculer l'un des décalages en prenant perpendiculairement à partir de l'autre)

P0, P1, p2, p3 = points de polygone:
P0 = start + perpoffset - diroffset
p1 = start - perpoffset - diroffset
p2 = + extrémité perpoffset + diroffset
p3 = fin - perpoffset + diroffset

P.S. Tu es la dernière personne à qui j'expliquerai ce truc. Des choses comme celles-ci doivent être comprises intuitivement.

+1

+1 pour les jolis graphismes. –

+0

+1! Très bonne réponse. – Alerty

+0

Merci beaucoup, j'apprécie énormément cette explication, malgré avoir pris Alegebra 1 et 2 et Physics au lycée j'ai encore des problèmes avec ces choses ... – jmasterx

1

La façon de le faire avec une ligne droite est de trouver la ligne perpendiculaire (N) à la ligne d'origine, un pas de 5 pixels dans cette direction et ensuite trouver la perpendiculaire à la perpendiculaire en ce point

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

la façon de le faire avec une ligne non droite est à rapprocher avec beaucoup de lignes droites ou si vous avez la représentation analytique de la ligne, de trouver une sorte de solution analytique d'une manière similaire à celle de la ligne droite.

0

Vous aurez besoin de connaissances en mathématiques. Commencez par comprendre le line (équations linéaires et fonctions linéaires) qu'est-ce qu'un parallel et profitez de la recherche géométrique transformations. Après cela, vous comprendrez la réponse de SigTerm ...

1

Essayez cette pseudo-code non testé:

# 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) 

Comme sigterm montre dans son schéma agréable, vous voulez obtenir les lignes de chaque côté de la ligne prévue: si passer thickness/2 pour la distance et appeler deux fois , une fois avec other_side=true, et tracez une épaisseur centrée sur la «ligne abstraite».

Questions connexes