说一下我的情况。
我做了个函数,可以在shell上根据一点坐标,边长,以及方向角,画出一个三角形。
也就是说这个三角形的另外两点坐标都是推算出来的。
推算函数如下:
public Point[] drawSite(GC gc, Display display,Site site)
{
//alpha暂时固定为15
int alpha = 15;
//通信角度转换为java角度
int angle = Tools.convertCtoJ(site.getAngle());
//获得经纬度转换后的中心点
Point center = site.getA();
//获得三角形边长
int length = site.getLenght();
//a点的x
double x1 =center.x+length * Math.cos((angle+alpha)*Math.PI/180);
//a点的y
double y1 =center.y-length * Math.sin((angle+alpha)*Math.PI/180);
//b点的x
double x2 =center.x+length * Math.cos((angle-alpha)*Math.PI/180);
//b点的y
double y2 =center.y-length * Math.sin((angle-alpha)*Math.PI/180);
final Point a= new Point(center.x,center.y);
gc.drawPolyline(new int[]{a.x,a.y,(int) x1,(int) y1});
gc.drawPolyline(new int[]{(int) x1,(int) y1,(int) x2,(int) y2});
gc.drawPolyline(new int[]{(int) x2,(int) y2,a.x,a.y});
Point b = new Point((int)x1,(int)y1);
Point c = new Point((int)x2,(int)y2);
Point p[]={a,b,c};
return p;
}
如此便求出了这三角形的三个点。然后计算出两点之间的直线距离。
计算函数如下:
//已知两点的坐标求两点之间的距离
//d=(x1-x2)^2+(y1-y2)^2
//d等于x1-x2的2次方 + y1-y2的2次方
public static double getLength(Point a,Point b)
{
return Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y,2);
}
这样我获得了三角形的三条边根据海伦公式,就应该可以判断出我屏幕中任意点击一点,是否选中了这个三角形。
但是,我自己写的根据海伦公式判断的函数,总是提示,这三条边不能构成三角形。
理论上说,三角形三条边之和除以2应该永远大于第三边,可是我的就不是。不知道哪里出错了。
下面是我的判断函数。代码写的很乱,请见谅。希望大家帮我找找问题出在哪。
// 计算三角形面积
public static double herons(double a,double b,double c)
{
if (a + b > c && a + c > b && b + c > a)
{
double x = (a + b + c) / 2;
double d = x * (x - a) * (x - b) * (x - c);
double m = Math.sqrt(d);
return m;
}else
{
return 0.00;
}
}
// 随机选择任意一点,判断他是否在三角形内
public static boolean isInTriangle(Point a,Point b,Point c,Point z)
{
//校准鼠标点
// int n = 6;//校准系数
// z.x=z.x-n;
// z.y=z.y-n;
boolean bool=false;
/*====================主三角=========================*/
//获得三角形三条边的长度
double a_b = getLength(a,b);
double b_c = getLength(b,c);
double c_a = getLength(c,a);
double area =herons(a_b,b_c,c_a);
/*==================副三角a点替换为z点时=============*/
//替换a
double z_b = getLength(z,b);
b_c=getLength(b,c);
double c_z = getLength(c,z);
double area_az =herons(z_b,b_c,c_z);
// System.out.println(area_az);
/*==================副三角b点替换为z点时=============*/
// 替换b
double a_z = getLength(a,z);
double z_c = getLength(z,c);
c_a = c_a; double area_bz =herons(a_z,z_c,c_a);
// System.out.println(area_bz);
/*===================副三角c点替换为z时================*/
// 替换c
a_b = a_b;
double b_z = getLength(b,z);
double z_a = getLength(z,a);
double area_cz =herons(a_b,b_z,z_a);
// System.out.println(area_cz);
if(area_az == 0 || area_bz ==0 || area_cz==0)
{
System.out.println("不能构成三角形");
}
if(area_az+area_bz+area_cz<=area)
{
bool =true;
System.out.println("在内部");
}else
{
bool =false;
System.out.println("在外部");
}
return bool;
}
我做了个函数,可以在shell上根据一点坐标,边长,以及方向角,画出一个三角形。
也就是说这个三角形的另外两点坐标都是推算出来的。
推算函数如下:
public Point[] drawSite(GC gc, Display display,Site site)
{
//alpha暂时固定为15
int alpha = 15;
//通信角度转换为java角度
int angle = Tools.convertCtoJ(site.getAngle());
//获得经纬度转换后的中心点
Point center = site.getA();
//获得三角形边长
int length = site.getLenght();
//a点的x
double x1 =center.x+length * Math.cos((angle+alpha)*Math.PI/180);
//a点的y
double y1 =center.y-length * Math.sin((angle+alpha)*Math.PI/180);
//b点的x
double x2 =center.x+length * Math.cos((angle-alpha)*Math.PI/180);
//b点的y
double y2 =center.y-length * Math.sin((angle-alpha)*Math.PI/180);
final Point a= new Point(center.x,center.y);
gc.drawPolyline(new int[]{a.x,a.y,(int) x1,(int) y1});
gc.drawPolyline(new int[]{(int) x1,(int) y1,(int) x2,(int) y2});
gc.drawPolyline(new int[]{(int) x2,(int) y2,a.x,a.y});
Point b = new Point((int)x1,(int)y1);
Point c = new Point((int)x2,(int)y2);
Point p[]={a,b,c};
return p;
}
如此便求出了这三角形的三个点。然后计算出两点之间的直线距离。
计算函数如下:
//已知两点的坐标求两点之间的距离
//d=(x1-x2)^2+(y1-y2)^2
//d等于x1-x2的2次方 + y1-y2的2次方
public static double getLength(Point a,Point b)
{
return Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y,2);
}
这样我获得了三角形的三条边根据海伦公式,就应该可以判断出我屏幕中任意点击一点,是否选中了这个三角形。
但是,我自己写的根据海伦公式判断的函数,总是提示,这三条边不能构成三角形。
理论上说,三角形三条边之和除以2应该永远大于第三边,可是我的就不是。不知道哪里出错了。
下面是我的判断函数。代码写的很乱,请见谅。希望大家帮我找找问题出在哪。
// 计算三角形面积
public static double herons(double a,double b,double c)
{
if (a + b > c && a + c > b && b + c > a)
{
double x = (a + b + c) / 2;
double d = x * (x - a) * (x - b) * (x - c);
double m = Math.sqrt(d);
return m;
}else
{
return 0.00;
}
}
// 随机选择任意一点,判断他是否在三角形内
public static boolean isInTriangle(Point a,Point b,Point c,Point z)
{
//校准鼠标点
// int n = 6;//校准系数
// z.x=z.x-n;
// z.y=z.y-n;
boolean bool=false;
/*====================主三角=========================*/
//获得三角形三条边的长度
double a_b = getLength(a,b);
double b_c = getLength(b,c);
double c_a = getLength(c,a);
double area =herons(a_b,b_c,c_a);
/*==================副三角a点替换为z点时=============*/
//替换a
double z_b = getLength(z,b);
b_c=getLength(b,c);
double c_z = getLength(c,z);
double area_az =herons(z_b,b_c,c_z);
// System.out.println(area_az);
/*==================副三角b点替换为z点时=============*/
// 替换b
double a_z = getLength(a,z);
double z_c = getLength(z,c);
c_a = c_a; double area_bz =herons(a_z,z_c,c_a);
// System.out.println(area_bz);
/*===================副三角c点替换为z时================*/
// 替换c
a_b = a_b;
double b_z = getLength(b,z);
double z_a = getLength(z,a);
double area_cz =herons(a_b,b_z,z_a);
// System.out.println(area_cz);
if(area_az == 0 || area_bz ==0 || area_cz==0)
{
System.out.println("不能构成三角形");
}
if(area_az+area_bz+area_cz<=area)
{
bool =true;
System.out.println("在内部");
}else
{
bool =false;
System.out.println("在外部");
}
return bool;
}
解决方案 »
- 熟悉Java夏令时处理的进
- 一个简单程序代码,请大家批批!
- 真心求救!画面一览的明细行双击时,报一下错了!
- ALL 在web.xml中加载applicationContext.xml,来生成bean,为啥总是提示空指针错误
- java里画图。我用Xor模式,但是擦不干净以前画的线
- javascript 弹出窗口问题,高手帮忙解释一下各个语句的含义
- 下面的字节数组编程中文有乱码,大家帮忙
- 取applet窗口中文本筐的值(有趣而有难度!!)
- Iterator是一种什么样的类型
- 请问学了JAVA的一些基础知识后,我下来怎样继续提高?怎样学JAVA的网络编程?
- 求救...JTable 如何多一个格拖拉移动???
- 线程中的yield()方法????
测试指定坐标是否在 Shape 的边界内。
boolean contains(double x, double y, double w, double h)
测试 Shape 内部是否完全包含指定矩形区域。
boolean contains(Point2D p)
测试指定的 Point2D 是否在 Shape 的边界内。
boolean contains(Rectangle2D r)
测试 Shape 内部是否完全包含指定的 Rectangle2D。
否则是大于三角形的面积的。就是z点,和abc点的关系,abc就是a,b,c三个顶点构成的三角形。abx就是a,b,x三点构成的三角形。如果,f是求面积的函数。
f(abc) = f(abx) + f(acx) + f(bcx); 如果相等,在三角形内(严格讲,涵盖在三角形的边上,到时候你可以按照意愿排除这种情况)。
如果
f(abc) < f(abx) + f(acx) + f(bcx);
则是点在三角形外。好运:)package test;
import java.awt.Point;public class Test { public static double getLength(Point a, Point b) {
double x = a.getX() - b.getX();
double y = a.getY() - b.getY();
return Math.sqrt(x * x + y * y);
}
public static double getArea(Point a, Point b, Point c) { double al = getLength(c, b);
double bl = getLength(a, c);
double cl = getLength(a, b); if (al + bl > cl && al + cl > bl && bl + cl > al) {
double x = (al + bl + cl) / 2;
double d = x * (x - al) * (x - bl) * (x - cl);
double m = Math.sqrt(d);
return m;
} else {
return 0.00;
} }
//Is x in the area?
public static boolean inArea(Point a, Point b, Point c, Point x) {
double c1 = getArea(a, b, x);
double a1 = getArea(c, b, x);
double b1 = getArea(a, c, x);
double w = getArea(a, b, c);
System.out.println(w);
System.out.println(c1);
System.out.println(a1);
System.out.println(b1);
double r = c1 + a1 + b1;
System.out.println(r);
return (Math.abs(w - r) <= 0.000000001);
} public static void main(String[] args) {
Point p1 = new Point(0, 0);
Point p2 = new Point(10, 10);
Point p3 = new Point(10, 0);
double d = getLength(p1, p2);
double a = getArea(p1, p2, p3);
System.out.println(a);
boolean b1 = inArea(p1, p2, p3, new Point(5, 3));
System.out.println(b1);
boolean b2 = inArea(p1, p2, p3, new Point(5, 6));
System.out.println(b2); }
}