说一下我的情况。
我做了个函数,可以在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;
}

解决方案 »

  1.   

    没细看你的代码,不过我想,你既然计算出了三角形的3个坐标,那么可以把它包装进Polygon类,Polygon实现了Shape接口,Shape定义了几个方法可以测试指定坐标是否在 Shape 的边界内。 boolean contains(double x, double y) 
              测试指定坐标是否在 Shape 的边界内。 
     boolean contains(double x, double y, double w, double h) 
              测试 Shape 内部是否完全包含指定矩形区域。 
     boolean contains(Point2D p) 
              测试指定的 Point2D 是否在 Shape 的边界内。 
     boolean contains(Rectangle2D r) 
              测试 Shape 内部是否完全包含指定的 Rectangle2D。 
      

  2.   

    我的原理是这样的,如果某点在三角形内,那么该点分别和三角形三个点中某两点所构成的三个三角形的面积和,和整个三角形的面积是相等的。
    否则是大于三角形的面积的。就是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); }
    }