给定任意4个点坐标如ab,bc,cd,ad
在给定1个点,判断该点在图形内还是外,还是在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);
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(); }}