判断空间上三个点是否共线问题【找bug篇】

88 篇文章 0 订阅
36 篇文章 0 订阅


                   判断空间上三个点是否在同一直线上【找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("测试结束。。。");
	}
}


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

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


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在实际开发中,判断一个问题是前端bug还是后端bug需要根据具体情况来分析。以下是一些常见的判断方法: 1. 查看报错信息 如果出现了报错信息,可以先查看报错信息所在的文件或者位置。如果是前端代码报错,通常报错信息会指向前端代码的某一行,而如果是后端代码报错,报错信息则会指向后端代码的某一行。 2. 查看数据 如果数据没有正确返回或者返回的数据与预期不符,可以先查看数据返回的格式和内容,如果数据格式正确,但内容不符合预期,那么很可能是后端代码逻辑问题导致的。如果数据格式不正确,那么很可能是前端代码处理数据的问题。 3. 查看网络请求 如果是网络请求的问题,可以通过查看请求和响应信息来判断问题所在。如果请求没有发出去或者没有得到正确的响应,那么问题可能出现在前端代码或者网络环境;如果请求正确,但是后端没有正确地返回数据,那么问题可能出现在后端代码。 4. 分析业务逻辑 有些问题可能需要分析业务逻辑才能确定问题所在。比如,如果涉及到用户登录或者权限控制方面的问题,需要分析前端和后端代码的交互过程,才能确定问题所在。 综上所述,判断一个问题是前端bug还是后端bug需要综合考虑多个因素,包括报错信息、数据、网络请求和业务逻辑等方面的因素。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值