定义Triangle2D类和MyPoint2D类进行三角形的多种几何问题

(几何:Triangle2D类)定义Triangle2D类和MyPoint2D类(自己定义:2维点),要求如下:
A、三个MyPoint2D类数据域成员:p1、p2、p3;这个三个数据域都带有get和set方法。
B、一个无参构造方法,创建三个坐标为(0,0)、(1,1)、(2,5)的点组成的三角形。
C、一个带有指定点的三角形的构造方法。
D、一个返回三角形面积的方法getArea();
E、一个返回三角形周长的方法getPerimeter();
F、给定点p如果在当前三角形内返回true的方法contains(MyPoint p);
G、给定三角形t如果在当前三角形内返回true的方法contains(Triangle2D t);
H、给定三角形t如果与当前三角形有重叠部分返回true的方法overlaps(Triangle2D t);

1.周长计算:
public double distance(MyPoint point) {//获取两个点之间的距离
		return Math.sqrt(Math.pow((x-point.getX()),2)+Math.pow((y-point.getY()),2));
	}
public double getPerimeter(){//获取三角形周长
		return p1.distance(p2)+p2.distance(p3)+p3.distance(p1);
	}
2.面积计算:(海伦公式)
public double getArea(){//获取三角形面积
		double a=p1.distance(p2);
		double b=p2.distance(p3);
		double c=p3.distance(p1);
		double p=this.getPerimeter()/2;
		return Math.sqrt(p*(p-a)*(p-b)*(p-c));
	}
3.判断点是否在三角形内:

放一张图:
定义Triangle2D类和MyPoint2D类进行三角形的多种几何问题_第1张图片
易知,当点在三角形内时,三角形面积等于图中三个三角形面积的和,这三个三角形的面积继续用海伦公式,即:

public boolean contains(MyPoint p) {//给定的点p在三角形中返回true
		double areaS=this.getArea();
		double pA=(p.distance(p1)+p.distance(p2)+p1.distance(p2))/2;
		double pB=(p.distance(p1)+p.distance(p3)+p1.distance(p3))/2;
		double pC=(p.distance(p3)+p.distance(p2)+p3.distance(p2))/2;
		double areaA=Math.sqrt(pA*(pA-p.distance(p1))*(pA-p.distance(p2))*(pA-p1.distance(p2)));
		double areaB=Math.sqrt(pB*(pA-p.distance(p1))*(pB-p.distance(p3))*(pB-p1.distance(p3)));
		double areaC=Math.sqrt(pC*(pA-p.distance(p3))*(pC-p.distance(p2))*(pC-p3.distance(p2)));
		if(areaS==areaA+areaB+areaC)
			return true;
		else 
			return false;
	}
4.判断两个三角形是否有重叠部分:

三角形的三个点,只要有一个被包含在另一个三角形,就重叠。三个点都被包含,这个三角形就被包含在另一个三角形里。即:

public boolean contains(Triangle2D t) {//给定的三角形t在三角形中返回true
		if(contains(t.p1)&&contains(t.p2)&&contains(t.p3))
			return true;
		else 
			return false;
	}
	public boolean overlaps(Triangle2D t) {//给定的三角形和本三角形重叠返回true
		if(contains(t.p1)||contains(t.p2)||contains(t.p3))
			return true;
		else 
			return false;
	}

哼,你以为就这么简单???这种情况呢!!!
定义Triangle2D类和MyPoint2D类进行三角形的多种几何问题_第2张图片
说实话,要背锅,这种情况确实没考虑到。所以换了一个思路,判断两个三角形是否重叠,可以通过判断是否有相交的边,只要有一条边相交,那么必然重叠,将功补过(intersectsLine方法用来判断两条线段是否相交):

		public boolean overlaps(Triangle2D t) {//给定的三角形和本三角形重叠返回true
			Line2D line1 = new Line2D.Double(t.p1.getX(),t.p1.getY(),t.p2.getX(),t.p2.getY());//声明并创建线段对象
			Line2D line2 = new Line2D.Double(t.p1.getX(),t.p1.getY(),t.p3.getX(),t.p3.getY());
			Line2D line3 = new Line2D.Double(t.p2.getX(),t.p2.getY(),t.p3.getX(),t.p3.getY());
			Line2D line4 = new Line2D.Double(this.p1.getX(),this.p1.getY(),this.p2.getX(),this.p2.getY());
			Line2D line5 = new Line2D.Double(this.p1.getX(),this.p1.getY(),this.p3.getX(),this.p3.getY());
			Line2D line6 = new Line2D.Double(this.p2.getX(),this.p2.getY(),this.p3.getX(),this.p3.getY());
			if(line1.intersectsLine(line4)||line1.intersectsLine(line5)||line1.intersectsLine(line6)||
					line2.intersectsLine(line4)||line2.intersectsLine(line5)||line2.intersectsLine(line6)||
					line3.intersectsLine(line4)||line3.intersectsLine(line5)||line3.intersectsLine(line6))
				return true;
			else
				return false;
		}

有问题,希望大佬指教。

完整代码如下,不好意思,之前判断三角形重叠提供了错误的思路,现已改正:
package num;

import java.awt.geom.Line2D;
public class Triangle2Dmain {    
    public static void main(String[] args) { 
    	Triangle2D t1=new Triangle2D(new MyPoint(0,0),new MyPoint(0,3),new MyPoint(3,4.5));
    	System.out.println("面积:"+t1.getArea()); 
    	System.out.println("周长:"+ t1.getPerimeter()); 
    	System.out.println("判断点是否包含:"+t1.contains(new MyPoint(3,3))); 
    	System.out.println("判断三角形是否包含:"+t1.contains(new Triangle2D(new MyPoint(2.9,2),new MyPoint(4,1),new MyPoint(1,3.4)))); 
    	System.out.println("判断三角形是否重叠部分:"+t1.overlaps(new Triangle2D(new MyPoint(2,5.5),new MyPoint(4,-3),new MyPoint(2,6.5)))); 
    }  
}  
 
class MyPoint{
	private double x;
	private double y;
	
	MyPoint(){
		this(0,0);
	}
	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 point) {//获取两个点之间的距离
		return Math.sqrt(Math.pow((x-point.getX()),2)+Math.pow((y-point.getY()),2));
	}
}
 
class Triangle2D{
	private MyPoint p1;
	private MyPoint p2;
	private MyPoint p3;
	
	Triangle2D(){
		this(new MyPoint(0,0),new MyPoint(3,0),new MyPoint(3,4));
	}
	Triangle2D(MyPoint p1,MyPoint p2,MyPoint p3){
		this.p1=p1;
		this.p2=p2;
		this.p3=p3;
	}
	public double getArea(){//获取三角形面积
		double a=p1.distance(p2);
		double b=p2.distance(p3);
		double c=p3.distance(p1);
		double p=this.getPerimeter()/2;
		return Math.sqrt(p*(p-a)*(p-b)*(p-c));
	}
	public double getPerimeter(){//获取三角形周长
		return p1.distance(p2)+p2.distance(p3)+p3.distance(p1);
	}
	public boolean contains(MyPoint p) {//给定的点p在三角形中返回true
		double areaS=this.getArea();
		double pA=(p.distance(p1)+p.distance(p2)+p1.distance(p2))/2;
		double pB=(p.distance(p1)+p.distance(p3)+p1.distance(p3))/2;
		double pC=(p.distance(p3)+p.distance(p2)+p3.distance(p2))/2;
		double areaA=Math.sqrt(pA*(pA-p.distance(p1))*(pA-p.distance(p2))*(pA-p1.distance(p2)));
		double areaB=Math.sqrt(pB*(pA-p.distance(p1))*(pB-p.distance(p3))*(pB-p1.distance(p3)));
		double areaC=Math.sqrt(pC*(pA-p.distance(p3))*(pC-p.distance(p2))*(pC-p3.distance(p2)));
		if(areaS==areaA+areaB+areaC)
			return true;
		else 
			return false;
	}
	public boolean contains(Triangle2D t) {//给定的三角形t在三角形中返回true
		if(contains(t.p1)&&contains(t.p2)&&contains(t.p3))
			return true;
		else 
			return false;
	}
		public boolean overlaps(Triangle2D t) {//给定的三角形和本三角形重叠返回true
			Line2D line1 = new Line2D.Double(t.p1.getX(),t.p1.getY(),t.p2.getX(),t.p2.getY());//声明并创建线段对象
			Line2D line2 = new Line2D.Double(t.p1.getX(),t.p1.getY(),t.p3.getX(),t.p3.getY());
			Line2D line3 = new Line2D.Double(t.p2.getX(),t.p2.getY(),t.p3.getX(),t.p3.getY());
			Line2D line4 = new Line2D.Double(this.p1.getX(),this.p1.getY(),this.p2.getX(),this.p2.getY());
			Line2D line5 = new Line2D.Double(this.p1.getX(),this.p1.getY(),this.p3.getX(),this.p3.getY());
			Line2D line6 = new Line2D.Double(this.p2.getX(),this.p2.getY(),this.p3.getX(),this.p3.getY());
			if(line1.intersectsLine(line4)||line1.intersectsLine(line5)||line1.intersectsLine(line6)||
					line2.intersectsLine(line4)||line2.intersectsLine(line5)||line2.intersectsLine(line6)||
					line3.intersectsLine(line4)||line3.intersectsLine(line5)||line3.intersectsLine(line6))
				return true;
			else
				return false;
		}
}
写在后面:

有问题请大佬指正!!!一条幽径,曲折迂回中总会激起心旷神怡的向往;一波巨澜,潮起潮落时更能叠出惊心动魄的鸣响;一个故事,遗憾悲婉里才有肝肠寸段的凄凉;一种人生,跌宕放诞放诞困顿中方显惊世骇俗的豪壮。
定义Triangle2D类和MyPoint2D类进行三角形的多种几何问题_第3张图片

你可能感兴趣的:(Java)