鍒ゅ畾涓涓偣鏄惁鍦ㄤ笁瑙掑艦鍐?/span>
濡備綍鍒ゅ畾涓涓偣P鏄惁瀛樺湪浜庢寚瀹氱殑涓夎褰BC鍐咃紝榪欒偗瀹氭槸涓涓畝鍗曠殑闂錛屾湰鏂囦粎鐢ㄤ竴涓浘褰㈢晫闈㈢▼搴忓睍紺轟簡璇ラ棶棰橈紝鏈夊叴瓚g殑鏈嬪弸鍙互鐪嬬湅銆?2008.07.24鏈鍚庢洿鏂?
鍦ㄦ澶勪嬌鐢ㄤ竴縐嶅父瑙佷笖綆渚跨殑鏂規硶錛?strong>濡傛灉涓夎褰AB錛孭AC鍜孭BC鐨勯潰縐箣鍜屼笌涓夎褰BC鐨勯潰縐浉絳夛紝鍗沖彲鍒ゅ畾鐐筆鍦ㄤ笁瑙掑艦ABC鍐?鍖呮嫭鍦ㄤ笁鏉¤竟涓?銆?br />
鍙煡錛岃鏂規硶鐨勫叧閿湪浜庡浣曡綆椾笁瑙掑艦鐨勯潰縐傚垢榪愬湴鏄紝褰撶煡閬撲笁瑙掑艦欏剁偣(A錛孊鍜孋)鐨勫潗鏍?(Ax, Ay)錛?Bx, By)鍜?Cx, Cy))涔嬪悗錛屽嵆鍙綆楀嚭鍏墮潰縐細
S = |(Ax * By + Bx * Cy + Cx * Zy - Ay * Bx - By * Cx - Cy * Ax) / 2|
鍏抽敭鐨勪唬鐮佸涓嬶紝
// 鐢辯粰瀹氱殑涓変釜欏剁偣鐨勫潗鏍囷紝璁$畻涓夎褰㈤潰縐?br />
// Point(java.awt.Point)浠h〃鐐圭殑鍧愭爣銆?/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;
}
// 鍒ゆ柇鐐筽os鏄惁鍦ㄦ寚瀹氱殑涓夎褰㈠唴銆?/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; // 鐢變簬嫻偣鏁扮殑璁$畻瀛樺湪鐫璇樊錛屾晠鎸囧畾涓涓凍澶熷皬鐨勬暟錛岀敤浜庡垽瀹氫袱涓潰縐槸鍚?榪戜技)鐩哥瓑銆?/span>
if (Math.abs(triangleArea - area) < epsilon) {
return true;
}
return false;
}
鎵ц璇ュ簲鐢ㄧ▼搴忥紝鐢ㄩ紶鏍囧湪鍏朵腑鐐瑰嚮涓夋錛屽嵆鍙粯鍒朵竴涓笁瑙掑艦錛屽涓嬬粍鍥炬墍紺猴細

鐒跺悗浠呴渶縐誨姩榧犳爣錛屽氨浼氬嚭鐜頒竴涓┖蹇冨渾鍦堛傚鏋滃渾鍦堢殑涓績鍦ㄤ笁瑙掑唴(鍖呭惈鍦ㄤ笁鏉¤竟涓?錛屽垯鍦嗗湀鏄劇ず涓虹孩鑹詫紱鍚﹀垯錛屾樉紺轟負钃濊壊銆傚涓嬬粍鍥炬墍紺猴細

瀹屾暣浠g爜濡備笅錛?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();
}
}

]]>