Java Graphics - Draw Triangle and Check Given Point is Inside or Outside
I have given here Java Graphics program to draw a triangle and check whether the given point is inside or outside the triangle
Source Code
import java.lang.*;
import java.util.*;
import java.util.List;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
public class PointInTriangle extends Frame {
public Polygon mypolygon = new Polygon();
public Point mypoint = new Point();
public static void drawPixel(Graphics g, int x, int y, int size, Paint color)
{
Graphics2D ga = (Graphics2D)g;
Shape circle = new Ellipse2D.Float(x, y, size, size);
ga.setPaint(color);
ga.draw(circle);
ga.setPaint(color);
ga.fill(circle);
}
public void paint(Graphics g) {
Graphics2D ga = (Graphics2D)g;
ga.setPaint(Color.red);
ga.draw(mypolygon);
ga.setPaint(Color.green);
drawPixel(g, mypoint.x, mypoint.y, 3, Color.blue);
}
public static int IsPointInBoundingBox(float x1, float y1, float x2, float y2, float px, float py)
{
float left, top, right, bottom; // Bounding Box For Line Segment
// For Bounding Box
if(x1 < x2)
{
left = x1;
right = x2;
}
else
{
left = x2;
right = x1;
}
if(y1 < y2)
{
top = y1;
bottom = y2;
}
else
{
top = y2;
bottom = y1;
}
if( (px+0.01) >= left && (px-0.01) <= right &&
(py+0.01) >= top && (py-0.01) <= bottom )
{
return 1;
}
else
return 0;
}
public static int LineSegmentIntersection(float l1x1, float l1y1, float l1x2, float l1y2,
float l2x1, float l2y1, float l2x2, float l2y2)
{
float dx, dy;
float intersection_X = 0;
float intersection_Y = 0;
dx = l1x2 - l1x1;
dy = l1y2 - l1y1;
float m1 = dy / dx;
float c1 = l1y1 - m1 * l1x1; // which is same as y2 - slope * x2
dx = l2x2 - l2x1;
dy = l2y2 - l2y1;
float m2 = dy / dx;
float c2 = l2y1 - m2 * l2x1; // which is same as y2 - slope * x2
if( (m1 - m2) == 0)
return 0;
else
{
intersection_X = (c2 - c1) / (m1 - m2);
intersection_Y = m1 * intersection_X + c1;
}
if(IsPointInBoundingBox(l1x1, l1y1, l1x2, l1y2, intersection_X, intersection_Y) == 1 && IsPointInBoundingBox(l2x1, l2y1, l2x2, l2y2, intersection_X, intersection_Y) == 1)
{
return 1;
}
else
return 0;
}
public static int ReadInteger()
{
try
{
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(input);
return Integer.parseInt(reader.readLine());
}
catch (Exception e)
{
e.printStackTrace();
return 0;
}
}
public static void main(String args[])
{
List< Integer > srcpoints = new ArrayList< Integer >();
for(int i = 0; i < 3; i++)
{
System.out.format("Enter x[%d]: ", i + 1);
srcpoints.add(ReadInteger());
System.out.format("Enter y[%d]: ", i + 1);
srcpoints.add(ReadInteger());
}
/***
srcpoints.add(200);srcpoints.add(200);
srcpoints.add(75);srcpoints.add(75);
srcpoints.add(100);srcpoints.add(200);
srcpoints.add(srcpoints.get(0));
srcpoints.add(srcpoints.get(1));
***/
PointInTriangle frame = new PointInTriangle();
for(int i = 0; i < srcpoints.size(); i++)
{
int x = srcpoints.get(i++);
int y = srcpoints.get(i);
frame.mypolygon.addPoint(x, y);
}
System.out.format("Enter Point X: ");
int x = ReadInteger();
System.out.format("Enter Point Y: ");
int y = ReadInteger();
/***
int x = 85;
int y = 100;
***/
int px = x + 1000;
int py = y;
frame.mypoint.x = x;
frame.mypoint.y = y;
int nCountIntersections = 0;
nCountIntersections += LineSegmentIntersection(srcpoints.get(0), srcpoints.get(1), srcpoints.get(2), srcpoints.get(3), x, y, px, py);
nCountIntersections += LineSegmentIntersection(srcpoints.get(2), srcpoints.get(3), srcpoints.get(4), srcpoints.get(5), x, y, px, py);
nCountIntersections += LineSegmentIntersection(srcpoints.get(4), srcpoints.get(5), srcpoints.get(0), srcpoints.get(1), x, y, px, py);
if( (nCountIntersections % 2) == 1)
System.out.println("The Given Point is inside the triangle");
else
System.out.println("The Given Point is outside the triangle");
frame.addWindowListener(
new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
}
);
frame.setSize(300, 250);
frame.setVisible(true);
}
}
/***
Enter x[1]: 200
Enter y[1]: 200
Enter x[2]: 75
Enter y[2]: 75
Enter x[3]: 100
Enter y[3]: 200
Enter Point X: 85
Enter Point Y: 100
The Given Point is inside the triangle
***/
Output
|
|