判定一个点是否在三角Ş?/span>
如何判定一个点P是否存在于指定的三角形ABC内,q肯定是一个简单的问题Q本文仅用一个图形界面程序展CZ该问题,有兴的朋友可以看看?2008.07.24最后更?
在此处用一U常见且便的Ҏ(gu)Q?strong>如果三角形PABQPAC和PBC的面U之和与三角形ABC的面U相{,卛_判定点P在三角ŞABC?包括在三条边??br />
可知Q该Ҏ(gu)的关键在于如何计三角Ş的面U。幸q地是,当知道三角Ş点(AQB和C)的坐?(Ax, Ay)Q?Bx, By)?Cx, Cy))之后Q即可计出光U:
S = |(Ax * By + Bx * Cy + Cx * Zy - Ay * Bx - By * Cx - Cy * Ax) / 2|
关键的代码如下,
// q定的三个点的坐标,计算三角形面U?br />
// Point(java.awt.Point)代表点的坐标?/span>
private static double triangleArea(Point pos1, Point pos2, Point pos3) {
double result = Math.abs((pos1.x * pos2.y + pos2.x * pos3.y + pos3.x * pos1.y
- pos2.x * pos1.y - pos3.x * pos2.y - pos1.x * pos3.y) / 2.0D);
return result;
}
// 判断点pos是否在指定的三角形内?/span>
private static boolean inTriangle(Point pos, Point posA, Point posB,
Point posC) {
double triangleArea = triangleArea(posA, posB, posC);
double area = triangleArea(pos, posA, posB);
area += triangleArea(pos, posA, posC);
area += triangleArea(pos, posB, posC);
double epsilon = 0.0001; // ׃点数的计算存在着误差Q故指定一个够小的数Q用于判定两个面U是?q似)相等?/span>
if (Math.abs(triangleArea - area) < epsilon) {
return true;
}
return false;
}
执行该应用程序,用鼠标在其中点击三次Q即可绘制一个三角ŞQ如下组图所C:

然后仅需Ud鼠标Q就会出C个空心圆圈。如果圆圈的中心在三角内(包含在三条边?Q则圆圈昄为红Ԍ否则Q显CZؓ蓝色。如下组图所C:

完整代码如下Q?br />
public class CanvasPanel extends JPanel {
private static final long serialVersionUID = -6665936180725885346L;
private Point firstPoint = null;
private Point secondPoint = null;
private Point thirdPoint = null;
public CanvasPanel() {
setBackground(Color.WHITE);
addMouseListener(mouseAdapter);
addMouseMotionListener(mouseAdapter);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
drawTriangel(g);
}
private void drawTriangel(Graphics g) {
if (firstPoint != null && secondPoint != null) {
g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
if (thirdPoint != null) {
g.drawLine(firstPoint.x, firstPoint.y, thirdPoint.x, thirdPoint.y);
g.drawLine(secondPoint.x, secondPoint.y, thirdPoint.x, thirdPoint.y);
}
}
}
private static boolean inTriangle(Point pos, Point posA, Point posB,
Point posC) {
double triangeArea = triangleArea(posA, posB, posC);
double area = triangleArea(pos, posA, posB);
area += triangleArea(pos, posA, posC);
area += triangleArea(pos, posB, posC);
double epsilon = 0.0001;
if (Math.abs(triangeArea - area) < epsilon) {
return true;
}
return false;
}
private static double triangleArea(Point pos1, Point pos2, Point pos3) {
double result = Math.abs((pos1.x * pos2.y + pos2.x * pos3.y + pos3.x * pos1.y
- pos2.x * pos1.y - pos3.x * pos2.y - pos1.x * pos3.y) / 2.0D);
return result;
}
private MouseInputAdapter mouseAdapter = new MouseInputAdapter() {
public void mouseReleased(MouseEvent e) {
Point pos = e.getPoint();
if (firstPoint == null) {
firstPoint = pos;
} else if (secondPoint == null) {
secondPoint = pos;
Graphics g = CanvasPanel.this.getGraphics();
CanvasPanel.this.paintComponent(g);
g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
} else if (thirdPoint == null) {
thirdPoint = pos;
Graphics g = CanvasPanel.this.getGraphics();
CanvasPanel.this.paintComponent(g);
g.drawLine(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
g.drawLine(firstPoint.x, firstPoint.y, thirdPoint.x, thirdPoint.y);
g.drawLine(secondPoint.x, secondPoint.y, thirdPoint.x, thirdPoint.y);
}
}
public void mouseMoved(MouseEvent e) {
Point pos = e.getPoint();
Graphics2D g2 = (Graphics2D) CanvasPanel.this.getGraphics();
CanvasPanel.this.paintComponent(g2);
if (firstPoint != null && secondPoint == null) {
g2.drawLine(firstPoint.x, firstPoint.y, pos.x, pos.y);
} else if (firstPoint != null && secondPoint != null && thirdPoint == null) {
g2.drawLine(firstPoint.x, firstPoint.y, pos.x, pos.y);
g2.drawLine(secondPoint.x, secondPoint.y, pos.x, pos.y);
} else if (firstPoint != null && secondPoint != null && thirdPoint != null) {
if (inTriangle(pos, firstPoint, secondPoint, thirdPoint)) {
g2.setColor(Color.RED);
} else {
g2.setColor(Color.BLUE);
}
int radius = 4;
g2.drawOval(pos.x - radius, pos.y - radius, radius * 2, radius * 2);
}
}
};
}
public class Triangle extends JFrame {
private static final long serialVersionUID = 1L;
private CanvasPanel mainPanel = null;
public Triangle() {
setTitle("Triangle");
setSize(new Dimension(300, 200));
setResizable(false);
init();
Container container = getContentPane();
container.add(mainPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void init() {
mainPanel = new CanvasPanel();
}
public static void main(String[] args) {
new Triangle();
}
}

]]>