有錯誤或者可以改進的地方歡迎大家指正
public class Triangle2D{
private MyPoint p1,p2,p3;
public Triangle2D(){
p1 = new MyPoint(0,0);
p2 = new MyPoint(1,1);
p3 = new MyPoint(2,5);
}
public Triangle2D(MyPoint p1, MyPoint p2, MyPoint p3){
this.p1 = p1;
this.p2 = p2;
this.p3 = p3;
}
//面積公式 s = (邊1 + 邊2 + 邊3)/2
//面積 = sqrt(s(s - 邊1)*(s - 邊2)*(s - 邊3))
public double getArea(){
double a = p1.distance(p2);
double b = p1.distance(p3);
double c = p2.distance(p3);
double p = (a+b+c)/2.0;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
public double getPerimeter(){
return (p1.distance(p2) + p1.distance(p3) +p2.distance(p3));
}
//分割三角形面積相加法如果三個三角形面積相加等于原面積,則該點在三角形邊上或者内部
public boolean contains(MyPoint p){
double area = this.getArea(); //求出原三角形的面積
Triangle2D t1 = new Triangle2D(p, this.p2, this.p3);
Triangle2D t2 = new Triangle2D(p, this.p1, this.p3);
Triangle2D t3 = new Triangle2D(p, this.p1, this.p2);
double t1s = t1.getArea();
double t2s = t2.getArea();
double t3s = t3.getArea();
if(area == t1s + t2s + t3s) {
return true;
}
else return false;
}
public boolean contains(Triangle2D t){
if(this.contains(t.getP1()) && this.contains(t.getP2()) && this.contains(t.getP3()))
return true;
return false;
}
//思路是隻要任意一條邊和剩餘三邊有交點則兩個三角形必然重疊
//公式的話可以去查詢*3.25(通過線性方程組求解)
public boolean overlaps(Triangle2D t){
//t p1p2與this三邊比較
double p1p2_p1p2 = ((t.p1.getY()-t.p2.getY())*(this.p1.getX()-this.p2.getX())) - ((t.p1.getX()-t.p2.getX())*(this.p1.getY()-this.p2.getY()));
double p1p2_p1p3 = ((t.p1.getY()-t.p2.getY())*(this.p1.getX()-this.p3.getX())) - ((t.p1.getX()-t.p2.getX())*(this.p1.getY()-this.p3.getY()));
double p1p2_p2p3 = ((t.p1.getY()-t.p2.getY())*(this.p2.getX()-this.p3.getX())) - ((t.p1.getX()-t.p2.getX())*(this.p2.getY()-this.p3.getY()));
//t p1p3與this三邊比較
double p1p3_p1p2 = ((t.p1.getY()-t.p3.getY())*(this.p1.getX()-this.p2.getX())) - ((t.p1.getX()-t.p3.getX())*(this.p1.getY()-this.p2.getY()));
double p1p3_p1p3 = ((t.p1.getY()-t.p3.getY())*(this.p1.getX()-this.p3.getX())) - ((t.p1.getX()-t.p3.getX())*(this.p1.getY()-this.p3.getY()));
double p1p3_p2p3 = ((t.p1.getY()-t.p3.getY())*(this.p2.getX()-this.p3.getX())) - ((t.p1.getX()-t.p3.getX())*(this.p2.getY()-this.p3.getY()));
//t p2p3與this三邊比較
double p2p3_p1p2 = ((t.p2.getY()-t.p3.getY())*(this.p1.getX()-this.p2.getX())) - ((t.p2.getX()-t.p3.getX())*(this.p1.getY()-this.p2.getY()));
double p2p3_p1p3 = ((t.p2.getY()-t.p3.getY())*(this.p1.getX()-this.p3.getX())) - ((t.p2.getX()-t.p3.getX())*(this.p1.getY()-this.p3.getY()));
double p2p3_p2p3 = ((t.p2.getY()-t.p3.getY())*(this.p2.getX()-this.p3.getX())) - ((t.p2.getX()-t.p3.getX())*(this.p2.getY()-this.p3.getY()));
if(p1p2_p1p2 != 0 && p1p2_p1p3 != 0 && p1p2_p2p3 != 0 && p1p3_p1p2 != 0 && p1p3_p1p3 != 0 && p1p3_p2p3 != 0
&& p2p3_p1p2 != 0 && p2p3_p1p3 != 0 && p2p3_p2p3 != 0 ) {
return true;
}
else return false;
}
public MyPoint getP1() {
return p1;
}
public void setP1(MyPoint p1) {
this.p1 = p1;
}
public MyPoint getP2() {
return p2;
}
public void setP2(MyPoint p2) {
this.p2 = p2;
}
public MyPoint getP3() {
return p3;
}
public void setP3(MyPoint p3) {
this.p3 = p3;
}
}
class MyPoint{
private double x,y;
public MyPoint(){
x = 0;
y = 0;
}
public MyPoint(double x, double y){
this.x = x;
this.y = y;
}
public double getX(){
return x;
}
public double getY(){
return y;
}
public double distance(MyPoint p){
return Math.sqrt(Math.pow(this.x - p.x, 2) + Math.pow(this.y - p.y, 2));
}
public double diatance(double x, double y){
return Math.sqrt(Math.pow(this.x - x, 2) + Math.pow(this.y - y, 2));
}
}
public class test_Triangle2D {
public static void main(String[] args) {
Triangle2D t1 = new Triangle2D(new MyPoint(2.5,2.0),new MyPoint(4.2,3.0),new MyPoint(5.0,3.5));
System.out.println("t1的面積和周長分别為: "+t1.getArea() + " " +t1.getPerimeter());
System.out.println("點(3,3)是否在t1三角形中 :" + t1.contains(new MyPoint(3,3)));
Triangle2D t2 = new Triangle2D(new MyPoint(2.9,2),new MyPoint(4,1),new MyPoint(1,3.4));
System.out.println("三點為(2.9,2)(4,1)(1,3.4)是否在t1三角形中 : "+t1.contains(t2));
Triangle2D t3 = new Triangle2D(new MyPoint(2,5.5),new MyPoint(4,-3),new MyPoint(2,6.5));
System.out.println("t3是否與t1重疊: "+t1.overlaps(t3));
}
}