zoukankan      html  css  js  c++  java
  • Triangle2D类(Java)

    定义Triangle2D类,包含:

    • 三个名为p1、p2和p3的MyPoint型数据域,这三个数据域都带有get和set方法。MyPoint在练习题10.4中定义。
    • 一个无参构造方法,该方法创建三个坐标为(0,0)、(1,1)和(2,5)的三个点组成的默认三角形。
    • 一个创建带指定点的三角形构造方法。
    • 一个返回三角形面积的方法getArea()。
    • 一个返回三角形周长的方法getPerimeter()。
    • 如果给定的点p在这个三角形内,那么方法contain(MyPoint p)返回true。如图a所示。
    • 如果给定的三角形在这个三角形内,那么方法contain(Triangle2D t)返回true。如图b所示。
    • 如果给定的三角形和这个三角形重叠,那么方法overlaps(Triangle2D t)返回true。如图c所示。

     MyPoint实现起来很简单,相信大家都会就不解释了

    一、MyPoint型数据域

              为了方便访问三角形的顶点,这里我没有设置访问器和修改器,用了一个数组,当然这样的方法很不规范,能改的话最好还是改了吧。

    二、无参构造方法,

              在此构造方法中直接对数据域进行赋值即可。

    三、创建带指定点的三角形构造方法。

              参数为3个MyPoint的对象

    四、getArea()。

              设A(x1,y1),B(x2,y2),C(x3,y3)
              由A-->B-->C-->A 按逆时针方向转。(行列式书写要求)
              设三角形的面积为S

                                          | x1 y1 1 |

              则S=(1/2)*         | x2 y2 1 | 

                                          | x3 y3 1 |

                 S=(1/2)*(x1y2*1+x2y3*1+x3y1*1-x1y3*1-x2y1*1-x3y2*1)

              顺时针需取绝对值

              即用三角形的三个顶点坐标求其面积的公式为:

                     S=|(1/2)*(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2)|

    五、getPerimeter()。

              MyPoint提供了求两点间距离的方法,可直接求三角形的三条边,求和得到周长。

    六、 contain(MyPoint p)

               

                注意:1、如果点刚好在三角形的边上,那么会出现一个三角形的面积为0,

                           2、由于面积是double型数据,double比较时精度会出现问题,所以这里用Double类的compare方法。

    七、contain(Triangle2D t)

                只需要保证三角形t的三个顶点都在此(this)三角形三角形中即可

    八、overlaps(Triangle2D t)

                参考博客:http://www.cnblogs.com/tuyang1129/p/9390376.html

                其实我这里还有几种特殊情况没考虑.

    public class Triangle2D {
    	private MyPoint p[]=new MyPoint[3];
        public Triangle2D() {
        	p[0]=new MyPoint(0,0);
        	p[1]=new MyPoint(1,1);
        	p[2]=new MyPoint(2,5);
        }
        public Triangle2D(MyPoint... point){
        	p[0]=point[0];
        	p[1]=point[1];
        	p[2]=point[2];
        }
        public double getArea(){
        	return Math.abs(0.5*(p[0].x*p[1].y+p[1].x*p[2].y+p[2].x*p[0].y-p[0].x*p[2].y-p[1].x*p[0].y-p[2].x*p[1].y));
        }
        public double getPerimeter(){
        	return p[0].distance(p[1])+p[0].distance(p[2])+p[1].distance(p[2]);
        }
        public boolean contains(MyPoint p){	       //面积法判断点在三角形内
        	double a=new Triangle2D(this.p[0],this.p[1],p).getArea();
        	double b=new Triangle2D(this.p[1],this.p[2],p).getArea();
        	double c=new Triangle2D(this.p[0],this.p[2],p).getArea();	
        	return Double.compare(a+b+c,this.getArea())==0&&a!=0&&b!=0&&c!=0;		//面积相等 并且 不存在面积为0的三角形
        }
        public boolean contains(Triangle2D t){      //保证三个顶点都在三角形内
        	return contains(t.p[0])&&contains(t.p[1])&&contains(t.p[2]);
        }
        public boolean judge(MyPoint a,MyPoint b,MyPoint c, MyPoint d){      //跨立实验,向量叉乘
        	double AB_AC=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
    		double AB_AD=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y);
    		double CD_CA=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y);
    		double CD_CB=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y);
        	return Double.compare(AB_AC*AB_AD,0)<0&&Double.compare(CD_CA*CD_CB,0)<0;
        }
        public boolean overlaps(Triangle2D t){
        	for(int i=0;i<2;i++)						//i、j从this三角形中获取两个点
        		for(int j=i+1;j<3;j++)
        			for(int a=0;a<2;a++)				//a、b从t三角形中从获取两个点
        				for(int b=a+1;b<3;b++)
        					if(judge(this.p[i],this.p[j],t.p[a],t.p[j])==true)
        						return true;
        	return false;
        }
        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()+" 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{
    	public double x,y;
    	public MyPoint(){
    		x=0;y=0;
    	}
    	public MyPoint(double  x,double y){
    		this.x=x;this.y=y;
    	}
    	public double distance(MyPoint other){
    		return Math.sqrt(Math.pow(x-other.x,2)+Math.pow(y-other.y,2));
    	}
    	public double distance(int x,int y){
    		return Math.sqrt(Math.pow(x-this.x,2)+Math.pow(y-this.y,2));
    	}
    }
  • 相关阅读:
    MySQL 抓包工具
    php安全配置记录和常见错误梳理
    Mongodb副本集+分片集群环境部署记录
    线上mongodb 数据库用户到期时间修改的操作记录
    Redis+TwemProxy(nutcracker)集群方案部署记录
    Linux下Redis主从复制以及SSDB主主复制环境部署记录
    以多个实例方式打开Notepad++
    什么才是程序员的核心竞争力?zz
    谈谈如何在面试中发掘程序猿的核心竞争力zz
    解决Android SDK Manager更新时出现问题
  • 原文地址:https://www.cnblogs.com/F-itachi/p/9974344.html
Copyright © 2011-2022 走看看