很急,给80分

xiaozhangnima 2010-07-19 08:11:42
给定任意4个点坐标如ab,bc,cd,ad
在给定1个点,判断该点在图形内还是外,还是在4个边上
要好用的代码
有人说用向量积,向量有内积和外积,怎么写
写全好用给分
...全文
664 51 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ade子夜 2010-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dracularking 的回复:]
外积就是叉乘吧,判断这个得用叉乘,就是判断在边的同侧还是异侧

http://blog.csdn.net/dracularking/archive/2008/03/25/2217180.aspx
[/Quote]

ding!!!!!
victor_woo 2010-07-24
  • 打赏
  • 举报
回复
victor_woo 2010-07-24
  • 打赏
  • 举报
回复
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;
}
}


victor_woo 2010-07-24
  • 打赏
  • 举报
回复
任意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

/*
<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();
}
}
jacty 2010-07-21
  • 打赏
  • 举报
回复
数学不好的飘过。。
jennyzhangyi 2010-07-21
  • 打赏
  • 举报
回复
呵呵,帮顶下
DAVE_LUO 2010-07-21
  • 打赏
  • 举报
回复
学习了,顺便顶一下。
zhh1655 2010-07-21
  • 打赏
  • 举报
回复
数学题
Eric_wj 2010-07-21
  • 打赏
  • 举报
回复
I Like This
x1ong0106 2010-07-21
  • 打赏
  • 举报
回复
顶一下
eggno8 2010-07-21
  • 打赏
  • 举报
回复
做个标记,叉乘。。。叉乘。。。
likk9999 2010-07-21
  • 打赏
  • 举报
回复
学习下
gil_guo 2010-07-21
  • 打赏
  • 举报
回复
学习了
whlcy 2010-07-21
  • 打赏
  • 举报
回复
mark!!!!
whlcy 2010-07-21
  • 打赏
  • 举报
回复
mark!!!!
guopengchong 2010-07-21
  • 打赏
  • 举报
回复
学习了。。。。
xxf354 2010-07-21
  • 打赏
  • 举报
回复
学习了
wy9851 2010-07-21
  • 打赏
  • 举报
回复
有点像CS。。

看子弹能不能打中猪头。。
victor_woo 2010-07-21
  • 打赏
  • 举报
回复
这个不是程序问题!
victor_woo 2010-07-21
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 xiaozhangnima 的回复:]
忘了说了,java的
如a,b,c,d4个点,可能在一条线上,也可能是3个点在一条线
ad和bc还可能出现交叉的,所以说是不一定是四边形
谢谢楼上的各位,试了好用给分
欢迎答题,继续,呵呵
[/Quote]

你的补充还不清楚
我给你说清楚问题:

问题是:平面上任意位置选取4个点,按照选取顺序连线形成封闭区域,随意选取第五个点,判断No5是否在区域中或某条边上?

加载更多回复(30)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧