Solved

# graphing a polygon with double values

Posted on 2006-11-20
255 Views
I'm looking to generate plotted Point graph output using a graphic library that creates a 2D set of cartesian axes, plots points[i] for i = 0 to points.length-1. Also draws lines between each of points[n] and points[n+1] for n = 0 to points.length-2. Also plot a line from points[points.length-1] to points[0].

import java.lang.Math.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.Polygon;
import java.awt.Graphics;

/* more code above but not necessary to show i don't think */

public void draw ( Point[] points, String[] text )
{
x = new long[points.length];
y = new long[points.length];
tempPoint = new Point[points.length];
Graphics g1 = null;

for (int i = 0; i < points.length; i++)
{
x[i] = points[i].x();
y[i] = points[i].y();
tempPoint[i] = new Point(x[i], y[i]);
}

LongPolygon g = new LongPolygon(tempPoint);

g1.drawPolygon(g);
System.out.println(text);
}

private class LongPolygon extends Polygon
{
private Point[] tempPoints;

public LongPolygon(Point[] points)
{
tempPoints =  points;
}
}
0
Question by:shpark82
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points

LVL 10

Accepted Solution

ID: 17987233
I have no idea what you want to do, but here is some example code.

--PolygonExample.java
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

class PolygonExample extends JFrame
{
final static int NUM_POINTS = 10;

//Constructor
public PolygonExample()
{
//Set frame properties
this.setSize(800, 600);
this.setTitle("Polygon Example");
this.setLayout(null);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

//Fille list with some random points
Point2D.Double[] points = new Point2D.Double[NUM_POINTS];
for(int i=0;i<NUM_POINTS;i++)
{
double r1 = (Math.random()*20) - 10;
double r2 = (Math.random()*20) - 10;
points[i] = new Point2D.Double(r1, r2);
}

PolygonGraph pg = new PolygonGraph(points);
pg.setBounds(200, 100, 400, 400);
}

//Program entry
public static void main(String[] args)
{
PolygonExample pe = new PolygonExample();
pe.setVisible(true);
}
}

--PolygonGraph.java
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

class PolygonGraph extends JPanel
{
private Point2D.Double[] points;

//Screen points/sizes
final static int GRAPH_WIDTH = 400-1;
final static int GRAPH_HEIGHT = 400-1;

final static int GRAPH_ORIGIN_X = GRAPH_WIDTH/2;
final static int GRAPH_ORIGIN_Y = GRAPH_HEIGHT/2;

//Real points/sizes
final static double MIN_X = -10.0;
final static double MAX_X = 10.0;

final static double MIN_Y = -10.0;
final static double MAX_Y = 10.0;

final static double STEP_SIZE_X = 1.0;
final static double STEP_SIZE_Y = 1.0;

//Constructor
public PolygonGraph(Point2D.Double[] points)
{
this.setSize(GRAPH_WIDTH, GRAPH_HEIGHT);

this.points = points;
}

//Override paintcomponent
public void paintComponent(Graphics g)
{
super.paintComponent(g);

this.draw((Graphics2D) g);
}

//Draw graph
public void draw(Graphics2D g2)
{
this.drawGrid(g2);
this.drawPolygon(g2);
}

//Draw polygon
public void drawPolygon(Graphics2D g2)
{
//Set graphics properties
g2.setColor(Color.BLUE);

//Split points
int[] xPoints = new int[points.length];
int[] yPoints = new int[points.length];

//Create point lists
for(int i=0;i<points.length;i++)
{
Point p = realToScreen(points[i]);
xPoints[i] = (int) p.getX();
yPoints[i] = (int) p.getY();
}

//Draw polygon
g2.drawPolygon(xPoints, yPoints, points.length);
}

//Draw grid
public void drawGrid(Graphics2D g2)
{
Point p1; Point p2;
double gridX; double gridY;

//Draw vertical lines

//To the right
g2.setColor(Color.LIGHT_GRAY);
g2.setStroke(new BasicStroke(1));
gridX = 0;
while(gridX<MAX_X)
{
gridX += STEP_SIZE_X;

p1 = realToScreen(new Point2D.Double(gridX, MAX_Y));
p2 = realToScreen(new Point2D.Double(gridX, MIN_Y));
g2.drawLine((int) p1.getX(), (int) p1.getY(), (int) p2.getX(), (int) p2.getY());
}

//Center line
g2.setColor(Color.BLACK);
g2.setStroke(new BasicStroke(2));
p1 = realToScreen(new Point2D.Double(0, MAX_Y));
p2 = realToScreen(new Point2D.Double(0, MIN_Y));
g2.drawLine((int) p1.getX(), (int) p1.getY(), (int) p2.getX(), (int) p2.getY());

//To the left
g2.setColor(Color.LIGHT_GRAY);
g2.setStroke(new BasicStroke(1));
gridX = 0;
while(gridX>MIN_X)
{
gridX -= STEP_SIZE_X;

p1 = realToScreen(new Point2D.Double(gridX, MAX_Y));
p2 = realToScreen(new Point2D.Double(gridX, MIN_Y));
g2.drawLine((int) p1.getX(), (int) p1.getY(), (int) p2.getX(), (int) p2.getY());
}

//Draw horizontal lines

//To the top
g2.setColor(Color.LIGHT_GRAY);
g2.setStroke(new BasicStroke(1));
gridY = 0;
while(gridY<MAX_Y)
{
gridY += STEP_SIZE_Y;

p1 = realToScreen(new Point2D.Double(MAX_X, gridY));
p2 = realToScreen(new Point2D.Double(MIN_X, gridY));
g2.drawLine((int) p1.getX(), (int) p1.getY(), (int) p2.getX(), (int) p2.getY());
}

//Center line
g2.setColor(Color.BLACK);
g2.setStroke(new BasicStroke(2));
p1 = realToScreen(new Point2D.Double(MAX_X, 0));
p2 = realToScreen(new Point2D.Double(MIN_X, 0));
g2.drawLine((int) p1.getX(), (int) p1.getY(), (int) p2.getX(), (int) p2.getY());

//To the bottom
g2.setColor(Color.LIGHT_GRAY);
g2.setStroke(new BasicStroke(1));
gridY = 0;
while(gridY>MIN_Y)
{
gridY -= STEP_SIZE_Y;

p1 = realToScreen(new Point2D.Double(MAX_X, gridY));
p2 = realToScreen(new Point2D.Double(MIN_X, gridY));
g2.drawLine((int) p1.getX(), (int) p1.getY(), (int) p2.getX(), (int) p2.getY());
}
}

//Convert point from real to screen
public static Point realToScreen(Point2D.Double p)
{
double scaleXFactor = GRAPH_WIDTH  / (MAX_X-MIN_X);
double scaleYFactor = GRAPH_HEIGHT / (MAX_Y-MIN_Y);

double translateXFactor = -MIN_X;
double translateYFactor = -MIN_Y;

return new Point((int) Math.floor((p.getX()+translateXFactor)*scaleXFactor)
,(int) Math.floor((p.getY()+translateYFactor)*scaleYFactor));
}
}

I hope it works, I didn't test it thorougly. You should see it as a step in the right direction, you probably have to adjust quite a lot to fit your needs, but the design is flexible.

Good luck.
Mark
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

### Suggested Solutions

In this post we will learn different types of Android Layout and some basics of an Android App.
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
Viewers learn about how to reduce the potential repetitiveness of coding in main by developing methods to perform specific tasks for their program. Additionally, objects are introduced for the purpose of learning how to call methods in Java. Define …
Viewers learn about the scanner class in this video and are introduced to receiving user input for their programs. Additionally, objects, conditional statements, and loops are used to help reinforce the concepts. Introduce Scanner class: Importing…
###### Suggested Courses
Course of the Month2 days, 2 hours left to enroll