1 votos

Transformación de la función círculo en segmentos de línea redondeados a inglete

Estoy intentando conseguir líneas rápidas, suaves y de ancho variable en una aplicación gráfica. El objetivo es dibujar una línea de 2 segmentos con una esquina redondeada en el centro.

En última instancia, el objetivo sería minimizar lo siguiente:

  1. La cantidad de cuadriláteros (o triángulos si te resulta más fácil pensar en términos de eso.
  2. Minimizar el cálculo para encontrar los puntos de la geometría

Definiré el problema con puntos p0 , p1 y p2 . w1 sería la anchura del rectángulo a través de p0 y p1 y w2 sería la anchura del rectángulo entre p1 y p2 . el objetivo final sería conseguir un dibujo como este: enter image description here

Uno de los primeros problemas que se me plantean es el cálculo de la posición del emisor en una situación en la que w1w2 . He visto la fórmula cuando ambos anchos son iguales pero nunca la he visto extendida para anchos diferentes.

El problema con el enfoque basado en el mitter es cuando p0p1p2 es muy pequeño el mitter se hace extremadamente grande.

Después de calcular los dos cuadrantes formados por los puntos del árbol, la geometría se pasa a un sombreador de píxeles y el objetivo sería determinar matemáticamente qué píxeles hay que recortar para redondear la esquina exterior formada por los tres puntos.

Esta es la parte complicada. En el sombreador de píxeles no existe la concepción del espacio. Puedo pasar cosas como ángulos o ratios, etc., pero deben utilizarse para interpretar un valor xy interpolado de 0 a 1.

enter image description here

El diagrama anterior muestra mi comprensión de cómo se interpola el valor, pero la clave es que no tiene idea de qué tipo de forma está formando sólo su distancia de cada uno de los vértices.

Así que el problema que tengo esencialmente es: Dado el valor bidimensional que representa la posición interpolada de un píxel, averigua si el píxel debe ser sombreado o no.

Se puede utilizar cualquier valor específico para ayudar a interpretar y transformar el valor interpolado dado en.

0 votos

Parece que estás intentando hackear el sombreador de píxeles para que haga algo para lo que no está diseñado. Yo recomendaría aumentar el número de polígonos de la línea para formar la curva en las curvas. También hay un stackexchange para gráficos y creo que sería más adecuado para responder a esto que math.stackexchange

1voto

John Wayland Bales Puntos 36

He aquí una sugerencia de cómo se podría decidir si sombrear o no un píxel en el interior o en el exterior de la curva.

Shade pixel or not?

Estoy pensando que la idea es tener una curva suave desde $A$ a $B$ que es tangente a los lados exteriores de los rectángulos en los puntos $A$ y $B$ .

Esto se puede hacer de una manera suave mirando las relaciones de los ángulos y moviéndose suavemente entre una distancia de $W_1$ de $C$ a una distancia $W_2$ de $C$ .

Para un píxel determinado en $X$ que se encuentra entre los rayos $AC$ y $AB$ definan la relación $r_X=\dfrac{\angle ACX}{\angle ACB}$ .

Entonces $0\le r_X\le 1$ .

Entonces, para cada uno de esos píxeles $X$ definir una anchura

$$ W_X=(1-r_X)\cdot W_1+r_X\cdot W_2 $$

Tenga en cuenta que cuando $r_X=0$ entonces $W_X=W_1$ y cuando $r_X=1$ entonces $W_X=W_2$ .

La idea es sombrear el píxel $X$ a menos que esté más lejos de $C$ que $W_X$ .

Para la parte interior de la curva, marque un punto en $EC$ a distancia $W_1$ de $C$ y un punto en $CF$ a distancia $W_2$ de $C$ (Lo siento, olvidé poner esos dos puntos en el diagrama).

Entonces se puede hacer algo similar para los píxeles dentro de la curva.

Definir $s_Y=\dfrac{\angle ECY}{\angle ECF}$ . (Tenga en cuenta que $\angle ECF=\angle $ ACB).

Entonces defina

$$ W_Y=(1-s_Y)\cdot W_1+s_Y\cdot W_2 $$

A continuación, sombree el píxel $Y$ a menos que esté más lejos de $C$ que $W_Y$ .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X