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));
}
}
Triangle2D类(Java)的更多相关文章
- 类 java.util.Scannar方法
类 java.util.Scannar方法 ·Scannar (InputStream ln):用给定的输人流创建一个Scanner对象. ·String nextLlne():读取输入的下一行内容. ...
- JavaSE-基础语法(二)-系统类(java.lang.*)和工具类(java.util.*)
系统类(java.lang.*)和工具类(java.util.*) 一.系统类(java.lang.*) 这个包下包含java语言的核心类,如String.Math.System和Thread类等,使 ...
- Java基础-类加载机制与自定义类Java类加载器(ClassLoader)
Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...
- 类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。
类 java.util.Collections 提供了对Set.List.Map进行排序.填充.查找元素的辅助方法. 1. void sort(List) //对List容器内的元素排序,排序的规 ...
- 获取Spring容器中Bean实例的工具类(Java泛型方法实现)
在使用Spring做IoC容器的时候,有的类不方便直接注入bean,需要手动获得一个类型的bean. 因此,实现一个获得bean实例的工具类,就很有必要. 以前,写了一个根据bean的名称和类型获取b ...
- 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception
异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...
- java基础知识回顾之javaIO类--java序列化和反序列化
/** * * 一:理解序列化反序列化及其应用 * 序列化:把堆内存的对象转化成字节流的过程. * 反序列化:把字节流序列恢复重构成对象的过程. * 对象的序列化的用途:1.把对象的字节序列持久化, ...
- 声明了包的类Java命令找不到或无法加载主类
首先你需要配置环境变量: CLASSPATH=.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar java 命令会在 CLASSPATH 目录下找相应 ...
- 加密解密工具类(Java,DES)
一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...
随机推荐
- GIS案例学习笔记-ArcGIS整图大图出图实例教程
GIS案例学习笔记-ArcGIS整图大图出图实例教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 1. 通过出图比例尺(1:2000),地图范围测算图纸大小. 图 ...
- 学习JS的心路历程-参数传递方式(上)
很多人认为JS的传递方式是值是Call by value, 物件及数组是Call by Reference.甚至还有人宣称其实JS是Call by sharing,那到底是哪一个呢? 这两天我们一一来 ...
- kafka清理
由于项目原因,最近经常碰到Kafka消息队列拥堵的情况.碰到这种情况为了不影响在线系统的正常使用,需要大家手动的清理Kafka Log.但是清理Kafka Log又不能单纯的去删除中间环节产生的日志, ...
- win10自带IE上不了网的解决办法
1.cmd以管理员身份运行powershell. 2.输入以下三条程序. netsh int tcp set heuristics disabled 回车执行后再输入 netsh int tcp se ...
- 自动化运维工具Ansible的部署步骤详解
本文来源于http://sofar.blog.51cto.com/353572/1579894,主要是看到这样一篇好文章,想留下来供各位同僚一起分享. 一.基础介绍 ================= ...
- Java将一个字符串的首位改为大写后边改为小写的实现,String
Java将一个字符串的首位改为大写后边改为小写的实现,String 思路: 获取首字母, charAt(0) substring(0,1) 转成大写 toUpperCase() 转大写hellO=== ...
- linux删除历史操作命令
有时候在系统中做了任何操作,但不想被别人知道,毕竟系统别人都可以登入查看,那怎么把自己操作系统的历史命令删除而不让别人知晓呢? 在linux系统里一旦操作了任何命令,都会被记录下来,可以通过histo ...
- 《java与模式》阅读笔记01
这次我读了前两章的内容,就如书名所言,这本书主要将的就是java中的模式,在书中的序言就把所有的模式都介绍了一下,主要有, 1.创建模式:简单工厂模式,工厂方法模式,抽象工厂模式,建造模式 2.行为模 ...
- rancher2 挂载ceph-rbd
一-创建ceph-secret.yml文件 RBD的KEY查看 ceph auth list 复制 client.admin 的key 并使用base64加密 创建ceph-secret.yml ku ...
- cf-Global Round2-D. Frets On Fire(二分)
题目链接:http://codeforces.com/contest/1119/problem/D 题意:给n(<=1e5)个数s[i],i=1..n,(0<=s[i]<=1e18) ...