Java实现点类(MyPoint)和三角形类(Triangl2D)

主要实现获取两个点之间的距离、判断点和三角形的位置关系、判断三角形和三角形的位置关系。

import java.awt.geom.Line2D;
public class Text {    
    public static void main(String[] args) { 
    	Triangle2D t1=new Triangle2D(new MyPoint(2.5,2),new MyPoint(4.2,3),new MyPoint(5,3.5));
    	System.out.println("Area is "+t1.getArea()+" and perimeter is "+ 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(1,1),new MyPoint(2,5));
	}
	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)&&line1.intersectsLine(line5)||line1.intersectsLine(line4)&&line1.intersectsLine(line5))
//				||(line2.intersectsLine(line4)&&line2.intersectsLine(line5)||line2.intersectsLine(line6)&&line2.intersectsLine(line5)||line2.intersectsLine(line4)&&line2.intersectsLine(line5))
//				||(line3.intersectsLine(line4)&&line3.intersectsLine(line5)||line3.intersectsLine(line6)&&line3.intersectsLine(line5)||line3.intersectsLine(line4)&&line3.intersectsLine(line5))
//				||t.contains(p1)||t.contains(p2)||t.contains(p3)||this.contains(p1)||this.contains(p2)||this.contains(p3))
		//Old Method:其中一个三角形的某一边和另一个三角形的某两条边相交  或  某一三角形的一个顶点在另一个三角形内
		if(line1.intersectsLine(line4)||line1.intersectsLine(line5)||line1.intersectsLine(line5)||
				line2.intersectsLine(line4)||line2.intersectsLine(line5)||line2.intersectsLine(line5)||
				line3.intersectsLine(line4)||line3.intersectsLine(line5)||line3.intersectsLine(line5))
		//New Method:其中一个三角形的某一边和另一个三角形的某一边相交
			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;
	}	
}

整体并不难,主要的问题就是判断三角形是否重叠(overlaps)。我一开始想的是有两种情况:
1、2、
因此需要判断其中一个三角形的某条边是否和另一个三角形的某两条边相交,或者一个三角形的某一顶点在另一个三角形内。

但经过继续思考,发现其实只要判断其中一个三角形的某一边和另一个三角形的某一边相交,就能确定重叠。 因此改成了New Method。
注:这里根据提示使用类java.awt.geom.Line2D简化了计算。先构造两个三角形的六条边,然后使用方法 (boolean) Line2D.intersectsLine(Line2D line) 测试指定线段是否相交。

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值