日期:2014-05-20  浏览次数:20858 次

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

------解决方案--------------------
探讨

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

------解决方案--------------------
帮顶!
------解决方案--------------------
这是一个典型的凸包问题 是一个算法题

你百度下就可以找到答案
------解决方案--------------------
改下
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分种--!
------解决方案--------------------
我顶。。。。。。。。。。。。。。。
------解决方案--------------------
帮忙顶
------解决方案--------------------
任意4个点按选取顺序形成封闭区域,判别第五个点是否在区域内

1:花了2-3个小时完成了这个题目,相当复杂
定义了 Point, Vector, Line, Triangle等几何对象
实现MouseEvent MouseMoveEvent

2:动态鼠标,形状智能支持,选取不同数目位置,显示的形状逐步丰富
当选完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
Java code

/*
<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();
    }
}