tags:

views:

593

answers:

2

Background:

I want to be able to take a 2d matrix (an image really), and a set of points defining a polygon, and draw that polygon into the matrix.

Before I run off and reinvent the wheel, I thought I'd ask if anyone knew of any existing libraries or code in Octave that does this. So far, my searches through the Octave packages and google have come up empty.

Failing in that, neither is too hard to implement, but I'm unsure how to draw a filled polygon. Is there an easy/efficient way to tell which points are inside a polygon and which are outside? Thanks.

Edit:

My purpose isn't displaying anything. Actually, what I'm specifically looking at doing is some image processing stuff, like plotting a convex hull, finding its area, finding the parts of the convex hull not in the original object, etc.

I don't see that Gnu Plot actually give me back any data I can work with. If I'm wrong, by all means tell me how. Thanks.

+1  A: 

EDIT: responding to the OP's edit up top to make it easier to find:

There are a variety of ways to make gnuplot render directly to a file (scroll down to "Terminal") which you can then read in for analysis. For example, you can output to portable bitmap format which is strikingly easy to read and write (if not small and elegant). Note that, by definition, PBM will give you an array of blacks and whites.

For example, check out this use of the "set terminal" and "set output" commands to render to a series of Unix pipes that produce a pbm and then a png file.

End EDIT:

Gnu Octave defaults to using gnuplot for plotting and it happens that gnuplot is quite good at producing filled polygons. Here are some helpful demonstrations of exactly that sort of thing. For example, here are some filled polygons:

# 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

Here's another demonstration script that draws the crazy face at the bottom of the filled curves page:

# 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
Bob Cross
Thanks, but not quite sure this is what I need. Please see my edit. Thanks again.
BigBeagle
+1  A: 

For finding points within a polygon, you can try Darren Engwirda's MATLAB function posted on MATLAB Central: http://www.mathworks.com/matlabcentral/fileexchange/10391

I looked briefly through the code and don't see anything that's particularly MATLAB specific, so it may run as-is in Octave.

jkua
I already ended up implementing something myself, but I appreciate the link. I'll have to see if it runs in Octave.
BigBeagle