给定任意4个点坐标如ab,bc,cd,ad
在给定1个点,判断该点在图形内还是外,还是在4个边上
要好用的代码
有人说用向量积,向量有内积和外积,怎么写
写全好用给分
在给定1个点,判断该点在图形内还是外,还是在4个边上
要好用的代码
有人说用向量积,向量有内积和外积,怎么写
写全好用给分
解决方案 »
- java基础问题
- 100分,遇到好难的数组分组问题
- 吐血推荐,没有看过这个真是白活了?
- 跪求答案,请问哪个大哥大姐能帮我做个题目,用JAVA编程,再过3天就要考的,谢谢啊~~
- 请高手帮忙,多谢,简单的题目……
- 如何安装Sun one Studio community Edition 4 for windows
- 为何我在一个JPanel中加入一个JPanel后第一个JPanel的宽度就变大了
- 如何实现动态刷新文本框?
- 一个特简单(对诸位高手来讲)但我至今却未解决的问题,望关注----程序测试时老提示说找不到运行环境,咋整的???
- 我想知道Jbuilder6的最新注册码或者序列号(高分向送)
- 一个很小的调查
- 如何计算出两个日期之间所间隔总年
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);
}
}
笨鸟先飞
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分种--!
如a,b,c,d4个点,可能在一条线上,也可能是3个点在一条线
ad和bc还可能出现交叉的,所以说是不一定是四边形
谢谢楼上的各位,试了好用给分
欢迎答题,继续,呵呵
定义了 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();
}
}
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;
}
}