zoukankan      html  css  js  c++  java
  • 判断空间上三个点是否共线问题【找bug篇】


                       判断空间上三个点是否在同一直线上【找bug篇】


    作者:Vashon

    时间:20150601   发布时间:20150718


    一、拿到问题,首先分析并理清思路。

    判断三点是否在同一条直线上需满足以下几点:

    1、两点共点(p1与p2共点,p1与p3共点,p2与p3共点)

    2、三点纵坐标相等,横坐标不相等

    3、三点横坐标相等,且纵坐标不相等(横坐标不相等则不存在除数为0问题)

    4、三点共点(可考虑可不考虑)

    以上几点需要把斜率考虑在内(斜率相等(除数不能为0,且满足随机输入))

    二、创建一个点的实体:

    package com.ywx.entities;
    
    public class Point{
    	private float x;
    	private float y;
    	public Point(float x,float y){
    		this.x=x;
    		this.y=y;
    	}
    	public float getX() {
    		return x;
    	}
    	public void setX(float x) {
    		this.x = x;
    	}
    	public float getY() {
    		return y;
    	}
    	public void setY(float y) {
    		this.y = y;
    	}
    }
    

    三、判断三点是否共线(包含历史测试代码):

    package com.ywx.isonlinetest;
    
    public class IsOnLine {
    	public static boolean IsLine(Point p1,Point p2,Point p3){
    		boolean flag=false;
    		float k1=0.0f;//斜率
    		float k2=0.0f;//斜率
    		
    		//1、两点共点(p1与p2共点,p1与p3共点,p2与p3共点)
    		if((p1.getX()==p2.getX()&&p1.getY()==p2.getY())
    				||(p1.getX()==p3.getX()&&p1.getY()==p3.getY())
    				||(p2.getX()==p3.getX()&&p2.getY()==p3.getY())){
    			flag=true;
    			return flag;
    		}
    		
    		//2、三点纵坐标相等,横坐标不相等
    		if((p1.getY()==p2.getY())&&(p1.getY()==p3.getY())
    				&&(p1.getX()!=p2.getX())&&(p1.getX()!=p3.getX())){
    			flag=true;
    			return flag;
    		}
    		//3、三点横坐标相等,且纵坐标不相等
    		if((p1.getX()==p2.getX())&&(p1.getX()==p3.getX())
    				&&(p1.getY()!=p2.getY())&&(p1.getY()!=p3.getY())){
    			flag=true;
    			return flag;
    		}else{//横坐标不相等则不存在除数为0问题
    			k1=(p3.getY()-p2.getY())/(p3.getX()-p2.getX());
    			k2=(p1.getY()-p2.getY())/(p1.getX()-p2.getX());
    			if(k1==k2){
    				flag=true;
    				return flag;
    			}
    		}
    		
    		//4、三点共点
    //		if(p1.getX()==p2.getX()&&p1.getX()==p3.getX()
    //				&&p1.getY()==p2.getY()&&p1.getY()==p3.getY()){
    //			flag=true;
    //		}
    		//5、斜率相等(除数不能为0,且满足随机输入)
    		//>>>>>中间点p2作为除数,则可以随机输入
    //		float n=p3.getX()-p2.getX();
    //		float m=p1.getX()-p2.getX();
    //		
    //		
    //		if(n!=0&&m!=0){//除数不能为0
    //			k1=(p3.getY()-p2.getY())/n;
    //			k2=(p1.getY()-p2.getY())/m;
    //			if(k1==k2){
    //				flag=true;
    //			}
    //		}
    		return flag;
    	}
    	//主方法
    	@SuppressWarnings("static-access")
    	public static void main(String args[]){
    		//三点共点
    		boolean bool=new IsOnLine().IsLine(new Point(0.0f,0.0f), new Point(0.0f,0.0f), new Point(0.0f,0.0f));
    //		 bool=new IsOnLine().IsLine(new Point(0.0f,0.0f), new Point(0.0f,0.0f), new Point(1.0f,1.0f));
    //		 bool=new IsOnLine().IsLine(new Point(1.0f,2.0f), new Point(2.0f,4.0f), new Point(4.0f,8.0f));
    //		 bool=new IsOnLine().IsLine(new Point(2.0f,3.0f), new Point(2.0f,5.0f), new Point(2.0f,8.0f));
    		 bool=new IsOnLine().IsLine(new Point(1.0f,1.0f), new Point(1.0f,1.0f), new Point(1.0f,1.0f));
    		 
    		//三点随机输入测试
    		 bool=new IsOnLine().IsLine(new Point(0.0f,2.0f), new Point(1.0f,1.0f), new Point(2.0f,0.0f));
    		 bool=new IsOnLine().IsLine(new Point(1.0f,1.0f), new Point(2.0f,0.0f), new Point(0.0f,2.0f));
    		 bool=new IsOnLine().IsLine(new Point(2.0f,0.0f), new Point(0.0f,2.0f), new Point(1.0f,1.0f));
    		
    		 
    		System.out.println("三点是否共线:"+bool);
    	}
    
    }
    四、用Junit测试(此部分主要是学习Junit测试):

    package com.ywx.test;
    
    import org.junit.After;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Ignore;
    import org.junit.Test;
    
    import com.ywx.count.IsOnLine;
    import com.ywx.count.Point;
    
    @SuppressWarnings("static-access")
    public class IsOnLineTest{
    	
    	@Test
    	public void test1(){//测试三点在原点(或共点)
    		boolean bool=new IsOnLine().IsLine(new Point(0.0f,0.0f),new Point(0.0f,0.0f),
    				new Point(0.0f,0.0f));
    		bool=new IsOnLine().IsLine(new Point(3.0f,3.0f),new Point(3.0f,3.0f),
    				new Point(3.0f,3.0f));
    		System.out.println("三点是否共线:"+bool);
    	}
    	@Test
    	public void test2(){//三点随机输入
    		boolean bool=new IsOnLine().IsLine(new Point(0.0f,2.0f), new Point(1.0f,1.0f), new Point(2.0f,0.0f));
    		bool=new IsOnLine().IsLine(new Point(1.0f,1.0f), new Point(2.0f,0.0f), new Point(0.0f,2.0f));
    		bool=new IsOnLine().IsLine(new Point(2.0f,0.0f), new Point(0.0f,2.0f), new Point(1.0f,1.0f));
    		
    		System.out.println("三点是否共线:"+bool);
    	}
    	@Test
    	public void test3(){//横坐标相等
    		boolean bool=new IsOnLine().IsLine(new Point(1.0f,2.0f), new Point(1.0f,2.0f), new Point(1.0f,5.0f));
    		
    		System.out.println("三点是否共线:"+bool);
    	}
    	@Test
    	public void test4(){//纵坐标相等
    		boolean bool=new IsOnLine().IsLine(new Point(5.0f,2.0f), new Point(1.0f,2.0f), new Point(3.0f,2.0f));
    		
    		System.out.println("三点是否共线:"+bool);
    	}
    	@Test
    	public void test5(){//斜率测试1
    		boolean bool=new IsOnLine().IsLine(new Point(1.0f,2.0f),new Point(2.0f,4.0f),
    				new Point(3.0f,6.0f));
    		bool=new IsOnLine().IsLine(new Point(0.0f,-1.0f),new Point(1.0f,0.0f),
    				new Point(2.0f,1.0f));
    		System.out.println("三点是否共线:"+bool);
    	}
    	@Test
    	public void test6(){//斜率测试2
    
    		boolean bool=new IsOnLine().IsLine(new Point(0.0f,-1.0f),new Point(1.0f,0.0f),
    				new Point(2.0f,1.0f));
    		bool=new IsOnLine().IsLine(new Point(1.0f,0.0f),new Point(2.0f,1.0f),
    				new Point(0.0f,-1.0f));
    		bool=new IsOnLine().IsLine(new Point(2.0f,1.0f),new Point(0.0f,-1.0f),
    				new Point(1.0f,0.0f));
    		
    		System.out.println("三点是否共线:"+bool);
    	}
    	@Test
    	public void test7(){
    		boolean bool=false;
    		Assert.assertTrue("返回结果:", new IsOnLine().IsLine(new Point(0.0f,-1.0f),new Point(1.0f,0.0f),
    				new Point(2.0f,1.0f)));
    		Assert.assertTrue("返回结果:", new IsOnLine().IsLine(new Point(0.0f,-1.0f),new Point(1.0f,0.0f),
    				new Point(2.0f,1.0f)));
    		Assert.assertTrue("返回结果:", new IsOnLine().IsLine(new Point(0.0f,-1.0f),new Point(1.0f,0.0f),
    				new Point(2.0f,1.0f)));
    	}
    	
    	
    	@Test
    	public void test0(){
    		
    		Assert.assertTrue("返回结果:", new IsOnLine().IsLine(new Point(1.0f,0.0f),new Point(2.0f,0.0f),
    				new Point(3.0f,0.0f)));
    		
    		Assert.assertTrue("返回结果:", new IsOnLine().IsLine(new Point(0.0f,1.0f),new Point(0.0f,2.0f),
    				new Point(0.0f,3.0f)));
    		
    		
    	}
    	@Before
    	public void test8(){
    		System.out.println("开始测试。。。");
    	}
    	@After
    	public void test9(){
    		System.out.println("测试结束。。。");
    	}
    }


    后记:最后得感谢当时带我的在一线打拼十余年的技术大牛,虽然这是一个小程序,但在他的苛刻要求及耐心指引下意识到很多,这将会在我以后的工作中能派上用场。

    总结:小小事情,大感悟。


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Metro-Ural119递推
    Flags-Ural1225简单递推
    Candies-POJ3159差分约束
    Is the Information Reliable? -POJ2983差分约束
    MPI Maelstrom
    Codeforces Round #342 (Div. 2)-B. War of the Corporations
    Codeforces Round #342 (Div. 2)-A. Guest From the Past
    Vim升华之树形目录插件NERDTree安装图解
    The Same Game-POJ1027模拟
    Flesch Reading Ease -POJ3371模拟
  • 原文地址:https://www.cnblogs.com/ywx-vashon/p/4895722.html
Copyright © 2011-2022 走看看