第六章第三十九题(几何:点的位置)(Geometry: point position)

6.39(几何:点的位置)编程练习题3.32显示如何测试一个点是否在一个有向直线的左侧、右侧,或在该直线上。使用下面的方法头编写该方法:

public static boolean leftOfTheLine(double x0, double y0, double x1, double y1, double x2, double y2)

public static boolean onTheSameLine(double x0, double y0, double x1, double y1, double x2, double y2)

public static boolean onTheLineSegment(double x0, double y0, double x1, double y1, double x2, double y2)

编写一个程序,提示用户输入三个点赋给p0、p1和p2,显示p2是否在从p0到p1的直线的左侧、右侧、直线上,或者线段上。

下面是一些运行示例:
Enter three points for p0, p1, and p2: 1 1 2 2 1.5 1.5
(1.5, 1.5) is on the line segment from (1.0, 1.0) to (2.0, 2.0)

Enter three points for p0, p1, and p2: 1 1 2 2 3 3
(3.0, 3.0) is on the same line from (1.0, 1.0) to (2.0, 2.0)

Enter three points for p0, p1, and p2: 1 1 2 2 1 1.5
(1.0, 1.5) is on the left side of the line from (1.0, 1.0) to (2.0, 2.0)

Enter three points for p0, p1, and p2: 1 1 2 2 1 –1
(1.0, −1.0) is on the right side of the line from (1.0, 1.0) to (2.0, 2.0)

6.39(Geometry: point position) Programming Exercise 3.32 shows how to test whether a point is on the left side of a directed line, on the right, or on the same line. Write the methods with the following headers:

public static boolean leftOfTheLine(double x0, double y0, double x1, double y1, double x2, double y2)

public static boolean onTheSameLine(double x0, double y0, double x1, double y1, double x2, double y2)

public static boolean onTheLineSegment(double x0, double y0, double x1, double y1, double x2, double y2)

Write a program that prompts the user to enter the three points for p0, p1, and p2and displays whether p2 is on the left side of the line from p0 to p1, right side, the same line, or on the line segment.

Here are some sample runs:

Enter three points for p0, p1, and p2: 1 1 2 2 1.5 1.5
(1.5, 1.5) is on the line segment from (1.0, 1.0) to (2.0, 2.0)

Enter three points for p0, p1, and p2: 1 1 2 2 3 3
(3.0, 3.0) is on the same line from (1.0, 1.0) to (2.0, 2.0)

Enter three points for p0, p1, and p2: 1 1 2 2 1 1.5
(1.0, 1.5) is on the left side of the line from (1.0, 1.0) to (2.0, 2.0)

Enter three points for p0, p1, and p2: 1 1 2 2 1 –1
(1.0, −1.0) is on the right side of the line from (1.0, 1.0) to (2.0, 2.0)

下面是参考答案代码:

import java.util.*;

public class PointPositionQuestion39 {
	public static void main(String[] args) {
		double x0, y0, x1, y1, x2, y2;
		Scanner inputScanner = new Scanner(System.in);
		System.out.print("Enter three points for p0, p1, and p2: ");
		x0 = inputScanner.nextDouble();
		y0 = inputScanner.nextDouble();
		x1 = inputScanner.nextDouble();
		y1 = inputScanner.nextDouble();
		x2 = inputScanner.nextDouble();
		y2 = inputScanner.nextDouble();
		
		if(onTheSameLine(x0, y0, x1, y1, x2, y2))
		{
			if(onTheLineSegment(x0, y0, x1, y1, x2, y2))
			{
				System.out.printf("(%f, %f) is on the line segment from "
						+ "(%f, %f) to (%f, %f)", x2, y2, x0, y0, x1, y1);
			}
			else
			{
				System.out.printf("(%f, %f) is on the same line from "
						+ "(%f, %f) to (%f, %f)", x2, y2, x0, y0, x1, y1);
			}
		}
		else
		{
			if(leftOfTheLine(x0, y0, x1, y1, x2, y2))
			{
				System.out.printf("(%f, %f) is on the left side of the line from "
						+ "(%f, %f) to (%f, %f)", x2, y2, x0, y0, x1, y1);
			}
			else
			{
				System.out.printf("(%f, %f) is on the right side of the line from "
						+ "(%f, %f) to (%f, %f)", x2, y2, x0, y0, x1, y1);
			}
		}
		
		inputScanner.close();
	}
	public static boolean leftOfTheLine(double x0, double y0, double x1, double y1,
			double x2, double y2)
	{
		double discriminant = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0);

		if(discriminant > 0)
			return true;
		else
			return false;
	}
	public static boolean onTheSameLine(double x0, double y0, double x1, double y1,
			double x2, double y2)
	{
		double discriminant = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0);

		if(discriminant == 0)
			return true;
		else
			return false;
		
	}
	public static boolean onTheLineSegment(double x0, double y0, double x1, double y1,
			double x2, double y2)
	{
		double discriminant = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0);
		
		if(0 == discriminant && x2 <= (x0 > x1?x0:x1) && x2 >= (x0 > x1?x1:x0))
			return true;
		else
			return false;
	}
}

运行效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注:编写程序要养成良好习惯
1.文件名要用英文,具体一点
2.注释要英文
3.变量命名要具体,不要抽象(如:a,b,c等等),形式要驼峰化
4.整体书写风格要统一(不要这里是驼峰,那里是下划线,这里的逻辑段落空三行,那里相同的逻辑段落空5行等等)
5.普通变量,方法名要小驼峰,类名要大驼峰,常量要使用全部大写加上下划线命名法
6.要学习相应的代码编辑器的一些常用快捷键,如:快速对齐等等

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值