¿Gnu Octave tiene algún código existente para dibujar líneas o polígonos?

StackOverflow https://stackoverflow.com/questions/1429165

  •  07-07-2019
  •  | 
  •  

Pregunta

Fondo:

Quiero poder tomar una matriz 2d (una imagen realmente) y un conjunto de puntos que definen un polígono, y dibujar ese polígono en la matriz.

Antes de salir corriendo y reinventar la rueda, pensé en preguntar si alguien sabía de alguna biblioteca o código existente en Octave que haga esto. Hasta ahora, mis búsquedas a través de los paquetes de Octave y Google han quedado vacías.

De lo contrario, tampoco es demasiado difícil de implementar, pero no estoy seguro de cómo dibujar un polígono relleno. ¿Hay una manera fácil / eficiente de saber qué puntos están dentro de un polígono y cuáles están afuera? Gracias.

Editar:

Mi propósito no es mostrar nada. En realidad, lo que específicamente estoy buscando hacer es algo de procesamiento de imágenes, como trazar un casco convexo, encontrar su área, encontrar las partes del casco convexo que no están en el objeto original, etc.

No veo que Gnu Plot realmente me devuelva ningún dato con el que pueda trabajar. Si me equivoco, por supuesto dime cómo. Gracias.

¿Fue útil?

Solución

Para encontrar puntos dentro de un polígono, puede probar la función MATLAB de Darren Engwirda publicada en MATLAB Central: http://www.mathworks.com/matlabcentral/fileexchange/10391

Miré brevemente el código y no veo nada que sea particularmente específico de MATLAB, por lo que puede ejecutarse tal cual en Octave.

Otros consejos

EDITAR: respondiendo a la edición superior del OP para facilitar la búsqueda:

Hay una una variedad de formas de hacer que gnuplot se procese directamente en un archivo ( desplácese hacia abajo hasta '' Terminal '') que luego puede leer para su análisis. Por ejemplo, puede salida a formato de mapa de bits portátil que es sorprendentemente fácil de leer y escribir (Si no es pequeño y elegante). Tenga en cuenta que, por definición, PBM le dará una gran variedad de negros y blancos.

Por ejemplo, consulte este uso del " set terminal " y " establecer salida " comandos para renderizar a una serie de tuberías Unix que producen un pbm y luego un archivo png.

Fin EDITAR:

Gnu Octave usa de manera predeterminada gnuplot para trazar y sucede que gnuplot es bastante bueno para producir polígonos rellenos. Aquí hay algunas demostraciones útiles de exactamente ese tipo de cosas. Por ejemplo, aquí hay algunos polígonos rellenos :

# set terminal png transparent nocrop enhanced font arial 8 size 420,320 
# set output 'fillcrvs.4.png'
set grid nopolar
set grid xtics nomxtics ytics nomytics noztics nomztics \
 nox2tics nomx2tics noy2tics nomy2tics nocbtics nomcbtics
set grid front   linetype 0 linewidth 1.000,  linetype 0 linewidth 1.000
set key outside right top vertical Right noreverse enhanced autotitles nobox
set title "The red bat: abs(x) with filledcurve xy=2,5" 
plot abs(x) with filledcurve xy=2,5

Aquí hay otro script de demostración que dibuja la cara loca en la parte inferior de la página de curvas rellenas:

# set terminal png transparent nocrop enhanced font arial 8 size 420,320 
# set output 'fillcrvs.6.png'
unset border
set dummy t,y
set grid nopolar
set grid xtics nomxtics ytics nomytics noztics nomztics \
 nox2tics nomx2tics noy2tics nomy2tics nocbtics nomcbtics
set grid layerdefault   linetype 0 linewidth 1.000,  linetype 0 linewidth 1.000
unset key
set label 1 "gnuplot" at 0, 1.2, 0 centre norotate front nopoint offset character 0, 0, 0
set label 2 "gnuplot" at 0.02, -0.6, 0 centre norotate front nopoint offset character 0, 0, 0
set arrow 1 from -0.1, 0.26, 0 to 0.18, -0.17, 0 head front nofilled linetype 5 linewidth 4.000 size first 0.100,40.000,90.000
set parametric
set size ratio 1 1,1
set noxtics
set noytics
set title "Let's smile with parametric filled curves" 
set xrange [ -1.00000 : 1.00000 ] noreverse nowriteback
set yrange [ -1.00000 : 1.60000 ] noreverse nowriteback
plot [t=-pi:pi]     sin(t),cos(t) with filledcurve xy=0,0 lt 15,        sin(t)/8-0.5,cos(t)/8+0.4 with filledcurve lt 3,        sin(t)/8+0.5,cos(t)/8+0.4 with filledcurve lt 3,        t/5,abs(t/5)-0.8 with filledcurve xy=0.1,-0.5 lt 1,     t/3,1.52-abs(t/pi) with filledcurve xy=0,1.8 lt -1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top