给定任意4个点坐标如ab,bc,cd,ad
在给定1个点,判断该点在图形内还是外,还是在4个边上
要好用的代码
有人说用向量积,向量有内积和外积,怎么写
写全好用给分

解决方案 »

  1.   

    ab,bc,cd,ad是四个边还是四个点?你要确定某点是不是在四个边确定的四边形内?还是在边上?
      

  2.   

    http://developer.51cto.com/art/200908/146258.htm C#版本的。
      

  3.   

    外积就是叉乘吧,判断这个得用叉乘,就是判断在边的同侧还是异侧http://blog.csdn.net/dracularking/archive/2008/03/25/2217180.aspx
      

  4.   

    import java.util.*;
    public class Test {
      public void judge(double[] x, double[] y, int a, int b) {
        double[] k = new double[4];
        
        k[0] = Math.abs((x[3] - x[0]) / (y[3] - y[0]));
        k[1] = Math.abs((x[3] - x[1]) / (y[3] - y[1]));
        k[2] = Math.abs((x[3] - x[2]) / (y[3] - y[2]));
        k[3] = Math.abs((x[2] - x[1]) / (y[2] - y[1]));    //冒泡排序,两大的是两竖, 两小的是两横
        double temp;
        for(int i = 0; i < 4; i++) {
          for( j = 0; j < 4 - i - 1; j++) {
            if(k[j] > k[j+1]) {
              temp = k[j];
              k[j] = k[j+1];
              k[j+1] = temp;
            }
          } 
        }  //判断
        if(b == k[0]* a || b == k[1]* a || b == k[2]* a || b == k[3]* a) {
          System.out.println("在线上");
        } else if(((b > k[0]*a && b < k[1]*a) || (b < k[0]*a && b > k[1]*a))
                   && ((b > k[2]*a && b < k[3]*a) || (b < k[2]*a && b > k[3]*a))) {
          System.out.println("在图形内");
        } else {
          System.out.println("在图像外");
        }
        
      }    public static void main(String[] args){
        double[] x = new int[4];
        double[] y = new int[4];
        double a, b;
        Scanner p = new Scanner(System.in);    for(int i = 0; i < 4; i++) {
          System.out.println("输入任意4个点,xy");
          x[i] = p.nextDouble();
          y[i] = p.nextDouble();
        }
        System.out.println();
        a = p.nextDouble();
        b = p.nextDouble();
        p.close();    judge(x, y, a, b);
      }
    }
    笨鸟先飞
      

  5.   

    有一句改成System.out.println("任意输入两个点");
      

  6.   

    改下
    import java.util.*;
    public class Test {
      public void judge(double[] x, double[] y, int a, int b) {
        double[] k = new double[4];
        
        k[0] = Math.abs((x[3] - x[0]) / (y[3] - y[0]));
        k[1] = Math.abs((x[3] - x[1]) / (y[3] - y[1]));
        k[2] = Math.abs((x[3] - x[2]) / (y[3] - y[2]));
        k[3] = Math.abs((x[2] - x[1]) / (y[2] - y[1]));    //冒泡排序,两大的是两竖, 两小的是两横
        double temp;
        for(int i = 0; i < 4; i++) {
          for( j = 0; j < 4 - i - 1; j++) {
            if(k[j] > k[j+1]) {
              temp = k[j];
              k[j] = k[j+1];
              k[j+1] = temp;
            }
          } 
        }  //判断
        if(b == k[0]* a || b == k[1]* a || b == k[2]* a || b == k[3]* a) {
          System.out.println("在线上");
        } else if(((b > k[0]*a && b < k[1]*a) || (b < k[0]*a && b > k[1]*a))
                   && ((b > k[2]*a && b < k[3]*a) || (b < k[2]*a && b > k[3]*a))) {
          System.out.println("在图形内");
        } else {
          System.out.println("在图像外");
        }
        
      }    public static void main(String[] args){
        double[] x = new int[4];
        double[] y = new int[4];
        double a, b;
        Scanner p = new Scanner(System.in);    System.out.println("输入任意4个点,xy");
        for(int i = 0; i < 4; i++) {    
          x[i] = p.nextDouble();
          y[i] = p.nextDouble();
        }
        System.out.println("输入任意1个点,ab");
        a = p.nextDouble();
        b = p.nextDouble();
        p.close();    judge(x, y, a, b);
      }
    }花了我27分种--!
      

  7.   

    忘了说了,java的
    如a,b,c,d4个点,可能在一条线上,也可能是3个点在一条线
    ad和bc还可能出现交叉的,所以说是不一定是四边形
    谢谢楼上的各位,试了好用给分
    欢迎答题,继续,呵呵
      

  8.   

    任意4个点按选取顺序形成封闭区域,判别第五个点是否在区域内1:花了2-3个小时完成了这个题目,相当复杂
    定义了 Point, Vector, Line, Triangle等几何对象
    实现MouseEvent MouseMoveEvent2:动态鼠标,形状智能支持,选取不同数目位置,显示的形状逐步丰富
      当选完3或4个点时可右键回退重新选取
      
    3:实现基本原理:将四边形按各种情况分解为2个三角形,改为判别是否在三角形中4: 涉及计算:已选取三点,第四点的位置判断(记下)
    选取第四点,根据前面的位置分解三角形
    计算两个直线的交点(本实现中是一定有交点的,不全面),采用了优化算法中最基本的黄金分割法
    三角形面积计算

    5: 文件清单及编译运行方法
    HelloAppletWorld_Mouse.java
    drawer.java
    _2DPoint.java

    放入同一个文件夹,javac *.java
    appletviewer HelloAppletWorld_Mouse.java

    6: 不过在java.awt中有更简单的实现方法(我也是在写的差不多时才发现)
    不放程序了,提醒: Polygon.contains()
    HelloAppletWorld_Mouse.java/*
    <HTML>
    <HEAD>
    <TITLE>A Simple Program</TITLE>
    </HEAD>

    <BODY bgcolor=gray>
    Here is the output of my program:<BR>
    <APPLET 
    CODE="HelloAppletWorld_Mouse.class" 
    WIDTH=650 HEIGHT=550
    >
    </APPLET>
    </BODY>

    </HTML>
    */import java.applet.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;public class HelloAppletWorld_Mouse extends Applet 
    implements MouseListener,MouseMotionListener
    {
    ArrayList<_2DPoint> m_listPoint  = new ArrayList<_2DPoint>(4);
    _2DPoint  m_obj5thPoint   = null;
    _2DPoint  m_objMovingPoint   = null;
      
       ArrayList<_2DPoint> m_listTopoWhen3P    = null;
       String   m_strPosDesc = null;
       int[] m_nNo4Pos = new int[3];
      
       ArrayList<_2DPoint> m_listAux4P     = new ArrayList<_2DPoint>();
       _2DPoint  m_objCrossPoint  = null;
       Triangle T1= null;
       Triangle T2= null;
      
       boolean m_b5InArea = false;
      
        public void init()
        {
         resize(800,800);
         addMouseListener(this);
         addMouseMotionListener(this);
        }
      
        public void paint(Graphics g) {
            if(m_listPoint.size()<1)
             return;
            
            drawer painter = new drawer((Graphics2D)g);
            if(T1!=null&&T2!=null)
        {
         painter.draw(T1,Color.red);
         painter.draw(T2,Color.blue);
        }
            _2DPoint lastP = null;
         if(m_listPoint.size()>0)
         {
         lastP = m_listPoint.get(0);
         painter.draw(lastP,Color.red);
         }
        
         if(m_listPoint.size()>1)
         {
         lastP = m_listPoint.get(1);
         painter.draw(lastP,Color.red);
         painter.draw(lastP,m_listPoint.get(0),Color.green);
         }
        
         if(m_listPoint.size()>2)
         {
         lastP = m_listPoint.get(2);
         painter.draw(lastP,Color.red);
         painter.draw(lastP,m_listPoint.get(1),Color.green);
         painter.draw(m_listPoint.get(0),m_listPoint.get(1),Color.green);
         }
        
         if(m_listPoint.size()>3)
         {
         lastP = m_listPoint.get(3);
         painter.draw(lastP,Color.red);
         painter.draw(lastP,m_listPoint.get(2),Color.green);
         painter.draw(m_listPoint.get(2),m_listPoint.get(1),Color.green);
         painter.draw(m_listPoint.get(1),m_listPoint.get(0),Color.green);
         painter.draw(m_listPoint.get(0),lastP,Color.green);
         }
         if(m_listPoint.size()<4)
         {
         painter.draw(m_objMovingPoint,lastP,Color.blue);
        }
        
        if(m_b5InArea)
         painter.draw2(m_objMovingPoint,Color.green);
        else
         painter.draw(m_objMovingPoint,Color.red);
        
        if(m_listTopoWhen3P!=null)
        {
         for(int i=0;i<m_listTopoWhen3P.size();i=i+2)
         {
         painter.draw(m_listTopoWhen3P.get(i),m_listTopoWhen3P.get(i+1),Color.pink);
         }
        }
        if(m_strPosDesc!=null)
         g.drawString(m_strPosDesc,10,10);
        
        if(m_listAux4P.size()>0)
        {
         painter.draw(m_listAux4P.get(0),m_listAux4P.get(1),Color.blue);
        }
        
        if(m_objCrossPoint!=null)
        {
         painter.draw(m_objCrossPoint,Color.yellow);
        }
        
        
        }
        
        public void mouseEntered(MouseEvent e){} 
    public void mouseExited(MouseEvent e) {}
    public void mouseReleased(MouseEvent e){} 
        public void mousePressed(MouseEvent e){}
       
        
        public void mouseClicked(MouseEvent e)
        {
         if(e.getButton()==1 && m_listPoint.size()<4){
         _2DPoint p = new _2DPoint(e.getX(),e.getY());
         m_listPoint.add(p);
         p.setIndex(m_listPoint.size());
        
         if(m_listPoint.size()==3)
         {
         m_listTopoWhen3P = _2DPoint.load123Topo(m_listPoint.get(0),m_listPoint.get(1),m_listPoint.get(2));
         }
        
         if(m_listPoint.size()==4)
         {
         int _4_1_2 = m_nNo4Pos[0];
         int _4_2_3 = m_nNo4Pos[1];
         int _4_3_1 = m_nNo4Pos[2];
        
         if(_4_1_2==1&&_4_2_3==1&&_4_3_1==1) //三点内部
         {
         m_listAux4P.add(m_listPoint.get(1));
         m_listAux4P.add(m_listPoint.get(3));
        
         T1 = new Triangle(m_listPoint.get(0),m_listPoint.get(1),m_listPoint.get(3));
         T2 = new Triangle(m_listPoint.get(1),m_listPoint.get(2),m_listPoint.get(3));
         }else if((_4_1_2*_4_2_3)*_4_3_1==1) //三个对角区域
         {
         if(_4_2_3==1){
         m_listAux4P.add(m_listPoint.get(0));
         m_listAux4P.add(m_listPoint.get(2));
        
         T1 = new Triangle(m_listPoint.get(0),m_listPoint.get(2),m_listPoint.get(3));
         T2 = new Triangle(m_listPoint.get(1),m_listPoint.get(2),m_listPoint.get(0));
         }
         if(_4_3_1==1){
         m_listAux4P.add(m_listPoint.get(1));
         m_listAux4P.add(m_listPoint.get(3));
         T1 = new Triangle(m_listPoint.get(0),m_listPoint.get(1),m_listPoint.get(3));
         T2 = new Triangle(m_listPoint.get(1),m_listPoint.get(2),m_listPoint.get(3));
         }
         if(_4_1_2==1){
         m_listAux4P.add(m_listPoint.get(0));
         m_listAux4P.add(m_listPoint.get(2));
         T1 = new Triangle(m_listPoint.get(0),m_listPoint.get(2),m_listPoint.get(3));
         T2 = new Triangle(m_listPoint.get(1),m_listPoint.get(2),m_listPoint.get(0));
         }
         }else //三个边外区域
         {
         if(_4_3_1==-1)
         {
         m_listAux4P.add(m_listPoint.get(1));
         m_listAux4P.add(m_listPoint.get(3));
         T1 = new Triangle(m_listPoint.get(0),m_listPoint.get(1),m_listPoint.get(3));
         T2 = new Triangle(m_listPoint.get(1),m_listPoint.get(2),m_listPoint.get(3));
         }
         if(_4_1_2==-1)
         {
         //34 12求交
         Line l1 = new Line(m_listPoint.get(2),m_listPoint.get(3));
         Line l2 = new Line(m_listPoint.get(0),m_listPoint.get(1));
        
         m_objCrossPoint = Line.getCrossPoint(l1,l2);
         m_objCrossPoint.setIndex(6);
        
         T1 = new Triangle(m_listPoint.get(0),m_listPoint.get(3),m_objCrossPoint);
         T2 = new Triangle(m_listPoint.get(1),m_listPoint.get(2),m_objCrossPoint);
         }
         if(_4_2_3==-1)
         {
         //14 23求交
         Line l1 = new Line(m_listPoint.get(3),m_listPoint.get(0));
         Line l2 = new Line(m_listPoint.get(2),m_listPoint.get(1));
        
         m_objCrossPoint = Line.getCrossPoint(l1,l2);
         m_objCrossPoint.setIndex(6);
        
         T1 = new Triangle(m_listPoint.get(0),m_listPoint.get(1),m_objCrossPoint);
         T2 = new Triangle(m_listPoint.get(3),m_listPoint.get(2),m_objCrossPoint);
         }
         }
         }
        
        
         repaint();
         }else if(e.getButton()==3 && m_listPoint.size()==4)
         {
         m_listPoint.remove(3);
         m_listAux4P.clear();
         m_objCrossPoint=null;
         T1=null;
         T2=null;
         repaint();
         }else if(e.getButton()==3 && m_listPoint.size()==3)
         {
         m_listPoint.remove(2);
         m_listTopoWhen3P.clear();
         m_listTopoWhen3P=null;
         repaint();
         }
        }
        
        public void mouseDragged(MouseEvent e){} 
       
        public void mouseMoved(MouseEvent e)
        {
         m_objMovingPoint = new _2DPoint(e.getX(),e.getY());
         m_objMovingPoint.setIndex(m_listPoint.size()+1);
        
         if(m_listPoint.size()==3)
         {
         _2DVector.locateP4(m_nNo4Pos,m_listPoint.get(0),m_listPoint.get(1),m_listPoint.get(2),m_objMovingPoint);
         m_strPosDesc="4-1-2:"+m_nNo4Pos[0]+"; 4-2-3:"+m_nNo4Pos[1]+";4-3-1:"+m_nNo4Pos[2];
         }
        
         if(T1!=null&&T2!=null)
         {
      m_b5InArea = T1.contains(m_objMovingPoint)||T2.contains(m_objMovingPoint);
         }
        
         repaint();
        }
    }
      

  9.   

    drawer.java//2010-7-23 09:44PM 
    import java.awt.*; public class drawer
    {  
    Graphics2D g2  = null;
    public drawer(Graphics2D g2)
    {
    this.g2 = g2;
    }

    void draw(_2DPoint p,Color c)
    {
    Color cc = g2.getColor();
    g2.setColor(c);
    g2.drawOval(p.x()-2,p.y()-2,4,4);

    g2.setColor(Color.black);
    g2.drawString(String.valueOf(p.index+"("+p.x()+","+p.y()+")"),p.x(),p.y());

    g2.setColor(cc);
    }

    void draw2(_2DPoint p,Color c)
    {
    Color cc = g2.getColor();
    g2.setColor(c);
    g2.fillOval(p.x()-4,p.y()-4,8,8);

    g2.setColor(Color.black);
    g2.drawString(String.valueOf(p.index+"("+p.x()+","+p.y()+")-IN"),p.x(),p.y());

    g2.setColor(cc);
    }

    void draw(_2DPoint p1,_2DPoint p2,Color c)
    {
    Color cc = g2.getColor();

    g2.setColor(c);

    g2.drawLine(p1.x(),p1.y(),p2.x(),p2.y());

    g2.setColor(cc);
    }

    void draw(Triangle t1,Color c)
    {
    Color cc = g2.getColor();

    g2.setColor(c);
    g2.fillPolygon(t1.polygon);
    g2.setColor(cc);
    }
    }
    _2DPoint.java//2010-7-23 09:44PM
    import java.util.*;
    import java.awt.*;public class _2DPoint
    {
    double x;
    double y;
    int index;
    _2DPoint(int x,int y){
    this.x = x; this.y = y;
    }
    _2DPoint(double x,double y){
    this.x = x; this.y = y;
    }
    public void setIndex(int m) {
    index=m;
    }

    int x() { return (int)x; }

    int y() { return (int)y; }

    public String toString() { return "("+x()+","+y()+")"; }
    static double distance(_2DPoint p1,_2DPoint p2) { return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); }

    static ArrayList<_2DPoint> load123Topo(_2DPoint p1,_2DPoint p2,_2DPoint p3) {
    ArrayList<_2DPoint> ppp = new ArrayList<_2DPoint>();
    _2DVector v21 = new _2DVector(p2,p1);
    ppp.add(p1);
    ppp.add(v21.movePoint(p1,100));

    ppp.add(p2);
    ppp.add(v21.movePoint(p2,-100));

    _2DVector v23 = new _2DVector(p2,p3);
    ppp.add(p3);
    ppp.add(v23.movePoint(p3,100));

    ppp.add(p2);
    ppp.add(v23.movePoint(p2,-100));

    _2DVector v13 = new _2DVector(p3,p1);
    ppp.add(v13.movePoint(p1,100));
    ppp.add(v13.movePoint(p3,-100));

    return ppp;
    }
    }class _2DVector
    {
    double x;
    double y;
    double len;

    _2DVector(_2DPoint p1,_2DPoint p2){
    this.x = p2.x-p1.x;
    this.y = p2.y-p1.y;
    len = Math.sqrt(this.x*this.x+this.y*this.y);
    }

    void anti(){
    this.x *= -1;
    this.y *= -1;
    }

    _2DPoint movePoint(_2DPoint p1,double dis){
    double x = p1.x+(dis*this.x/this.len);
    double y = p1.y+(dis*this.y/this.len);

    return new _2DPoint(x,y);
    }

    static boolean isParallel(_2DVector v1,_2DVector v2){
    return v1.x*v2.y-v1.y*v2.x<1e-6;
    }

    static int crossProductDirection(_2DVector v1,_2DVector v2){
    double value = v1.x*v2.y-v1.y*v2.x;
    return (int)(value/Math.abs(value));
    }

    static void locateP4(int[] pos,_2DPoint p1,_2DPoint p2,_2DPoint p3,_2DPoint p4) {
    //图形方向
    _2DVector v31 = new _2DVector(p3,p1);
    _2DVector v32 = new _2DVector(p3,p2);
    int dir = crossProductDirection(v31,v32);

    _2DVector v41 = new _2DVector(p4,p1);
    _2DVector v42 = new _2DVector(p4,p2);
    pos[0] = dir*crossProductDirection(v41,v42);

    _2DVector v43 = new _2DVector(p4,p3);
    pos[1] = dir*crossProductDirection(v42,v43);
    pos[2] = dir*crossProductDirection(v43,v41);
    }
    }class Line
    {
    _2DPoint p1=null;
    _2DPoint p2=null;

    _2DVector  v = null;
    double   len = 0.0;

    Line(_2DPoint p1,_2DPoint p2)
    {
    this.p1=p1;
    this.p2=p2;

    v = new _2DVector(p1,p2);
    len = _2DPoint.distance(p1,p2);
    }

    //只针对一定有交点的情况
    public double getPointDistance(_2DPoint p3) //用夹角表示,越大则越近
    {
    //检查点与直线两个端点的夹角,应该在>=170度
    double pToE = _2DPoint.distance(p1,p3);
    double pToS = _2DPoint.distance(p2,p3);

    //if(pToE<2||pToS<2)
    // return 1.0d; //max value

    //三角公式
    double cosAngle = (pToE*pToE+ pToS*pToS-len*len)/(2*pToE*pToS);

    return cosAngle;
    }

    static _2DPoint getCrossPoint(Line l1,Line l2)
    {
    //沿l1取点,从l1.p1和l1.p2向中间走,夹逼法,一直走到l2上

    double scopelen = l1.len;
    _2DPoint sp0 = l1.p1;
    _2DPoint sp2 = l1.p2;
    int nCounter=0;
    do
    {
    if((int)(scopelen*0.382)<2)
    {
    System.out.println(nCounter);
    return new _2DPoint((sp0.x+sp2.x)/2,(sp0.y+sp2.y)/2);
    }
    _2DPoint mpa = l1.v.movePoint(sp0,(scopelen*0.382));
    _2DPoint mpb = l1.v.movePoint(sp0,(scopelen*0.618));
    double mpa_l2 = l2.getPointDistance(mpa);
    double mpb_l2 = l2.getPointDistance(mpb);

    if(mpa_l2<=mpb_l2)
    sp2 = mpb;
    else
    sp0 = mpa;

    scopelen = _2DPoint.distance(sp0,sp2);

    }while(nCounter++<200);

    return null;
    }
    }class Triangle
    {
    _2DPoint p1=null;
    _2DPoint p2=null;
    _2DPoint p3=null;
    Polygon polygon = new Polygon();

    double dArea = 0.0d;

    Triangle(_2DPoint p1,_2DPoint p2,_2DPoint p3)
    {
    this.p1=p1;
    this.p2=p2;
    this.p3=p3;

    polygon.addPoint(p1.x(),p1.y());
    polygon.addPoint(p2.x(),p2.y());
    polygon.addPoint(p3.x(),p3.y());

    dArea = area(p1,p2,p3);
    }

    private static double area(_2DPoint p1, _2DPoint p2, _2DPoint p3) {
         return Math.abs((p1.x * p2.y + p2.x * p3.y + p3.x * p1.y
                - p2.x * p1.y - p3.x * p2.y - p1.x * p3.y) / 2.0D);
    }

    // 判断点pos是否在指定的三角形内 
    //在此处使用一种常见且简便的方法:如果三角形PAB,PAC和PBC的面积之和与三角形ABC的面积相等,即可判定点P在三角形ABC内(包括在三条边上)。
    //参考http://www.blogjava.net/
    public boolean contains(_2DPoint p) {
        
         double area = area(p, p1, p2);
        
         area += area(p, p2, p3);
         area += area(p, p3, p1);
        
         double epsilon = 0.0001;  // 由于浮点数的计算存在着误差,故指定一个足够小的数,用于判定两个面积是否(近似)相等。
        
         return Math.abs(dArea - area) < epsilon;
    }
    }