一、线圆相交
---点类3-P128
MyPoint类表示二维平面中的一个点,具有两个double类型属性:
横坐标
纵坐标
并具有一个构造方法(与类同名的方法)和以下普通方法:
1 构造方法:接收两个double型数据作为参数,分别设定为横坐标和纵坐标。
2 display()方法,无参数,输出坐标信息,格式形如“(10.0,20.0)”。
3 getInfo()方法,无参数,返回字符串类型的坐标信息,格式形如"(10.0,20.0)"。
4所有属性的置取方法。
5 move ()方法,接收两个double型数据作为参数,分别将横坐标和纵坐标移动相应的距离。
6 getDistance()方法,接收一个MyPoint类型对象作为参数,计算并返回double类型的两点间距离值。
---线段类2-P123
LineSeg类表示二维平面中的一个线段,具有两个MyPoint类型属性:
端点1
端点2
并具有一个构造方法(与类同名的方法)和以下普通方法:
1 构造方法:接收两个MyPoint类型对象作为参数,分别设定为两个端点。
2 intersection ()方法,接收一个LineSeg类型对象作为参数,判断两个线段是否相交并返回true或false。
3 display()方法,无参数,输出线段信息,格式形如“(10.0,20.0)---(10.0,30.0)”。
4 所有属性的置取方法。
5 getDistance()方法,接收一个MyPoint类型对象作为参数,计算并返回double类型的点线间距离值。
---圆类3-P128
MyCircle类表示二维坐标中的一个圆,具有两个属性:
圆心,MyPoint类型
圆半径,double类型
并具有一个构造方法(与类同名的方法)和以下普通方法:
1 构造方法:接收一个MyPoint类型对象和一个double型数据作为参数,分别设定为圆心和圆半径。
2 getArea()方法,无参数,计算并返回圆面积。
3 display()方法,无参数,输出圆心坐标和圆面积,格式形如"Circle Center:(10.0,20.0),radius=10.0,Area=314.0"。
4 intersection ()方法,接收一个LineSeg类型对象作为参数,判断线段和圆是否相交并返回true或false。
5 move ()方法,接收两个double型数据作为参数,分别将圆心横坐标和纵坐标移动相应的距离。
6 所有属性的置取方法。
要求编程实现上面的类,使给定的Test类能正常运行,首先判断给定的线段和圆是否相交,如相交则重复移动圆move(10,10),直到不相交为止,并实现相应的输出内容。
public class Test{
public static void main(String[] args)
{
double r = 50;
MyPoint center = new MyPoint(100,100);
MyCircle circle = new MyCircle(center, r);
LineSeg line1 = new LineSeg(new MyPoint(0,100), new MyPoint(100,200));
LineSeg line2 = new LineSeg(new MyPoint(0,0), new MyPoint(100,100));
line1.display();
circle.display();
System.out.println("line1&circle intersection: "+circle.intersection(line1));
System.out.println("---------------------------");
line2.display();
circle.display();
System.out.println("line2&circle intersection: "+circle.intersection(line2));
System.out.println("---------------------------");
while(circle.intersection(line2)){
circle.move(10,10);
circle.getCenter().display();
}
circle.display();
System.out.println("line2&newCircle intersection: "+circle.intersection(line2));
System.out.println("---------------------------");
}
}
【输入形式】
【输出形式】
(0.0,100.0)---(100.0,200.0)
Circle Center:(100.0,100.0),radius=50.0,Area=7850.0
line1&circle intersection: false
---------------------------
(0.0,0.0)---(100.0,100.0)
Circle Center:(100.0,100.0),radius=50.0,Area=7850.0
line2&circle intersection: true
---------------------------
(110.0,110.0)
(120.0,120.0)
(130.0,130.0)
(140.0,140.0)
Circle Center:(140.0,140.0),radius=50.0,Area=7850.0
line2&newCircle intersection: false
public class Test{
public static void main(String[] args)
{
double r = 50;
MyPoint center = new MyPoint(100,100);
MyCircle circle = new MyCircle(center, r);
LineSeg line1 = new LineSeg(new MyPoint(0,100), new MyPoint(100,200));
LineSeg line2 = new LineSeg(new MyPoint(0,0), new MyPoint(100,100));
line1.display();
circle.display();
System.out.println("line1&circle intersection: "+circle.intersection(line1));
System.out.println("---------------------------");
line2.display();
circle.display();
System.out.println("line2&circle intersection: "+circle.intersection(line2));
System.out.println("---------------------------");
while(circle.intersection(line2)){
circle.move(10,10);
circle.Center();
}
circle.display();
System.out.println("line2&newCircle intersection: "+circle.intersection(line2));
System.out.println("---------------------------");
}
}
class MyPoint
{
double x;
double y;
public MyPoint(double x,double y){
this.x=x;
this.y=y;
}
public void display(){
System.out.println(getlnfo());
}
public String getlnfo(){
return "("+String.valueOf(x)+","+String.valueOf(y)+")";}
public void move(double a,double b){
x = x+a;
y = y+b;
}
public double getDistance(MyPoint point){
double h=point.x-x;
double z=point.y-y;
double c=h*h+z*z;
return Math.sqrt(c);
}
}
class LineSeg
{
MyPoint point1;
MyPoint point2;
public LineSeg(MyPoint point1,MyPoint point2){
this.point1 = point1;
this.point2 = point2;
}
public boolean intersection(LineSeg l1
)
{
if (Math.max(point1.x,point2.x) < Math.min(l1.point1.x ,l1.point2.x)
|| Math.max(point1.y,point2.y) < Math.min(l1.point1.y,l1.point2.y)
|| Math.max(l1.point1.x,l1.point2.x) < Math.min(point1.x,point2.x)
|| Math.max(l1.point1.y,l1.point2.y) < Math.min(point1.y,point2.y))
{
return false;
}
if ((((point1.x - l1.point1.x) * (l1.point2.y - l1.point1.y) - (point1.y - l1.point1.y) * (l1.point2.x - l1.point1.x))
* ((point2.x - l1.point1.x) * (l1.point2.y - l1.point1.y) - (point2.y - l1.point1.y) * (l1.point2.x - l1.point1.x))) > 0
|| (((l1.point1.x - point1.x) * (point2.y - point1.y) - (l1.point1.y - point1.y) * (point2.x - point1.x))
* ((l1.point2.x - point1.x) * (point2.y - point1.y) - (l1.point2.y - point1.y) * (point2.x - point1.x))) > 0)
{
return false;
}
return true;
}
public void display(){
System.out.println("("+point1.x+","+point1.y+")---("+point2.x+","+point2.y+")");
}
private Double getLenWithPoints(double p1x, double p1y, double p2x, double p2y) {
Double length = null;
length = Math.sqrt(Math.pow(p2x - p1x, 2) + Math.pow(p2y - p1y, 2));
return length;
}
public Double getDistance(MyPoint point) {
Double length = null;
double b = getLenWithPoints(point1.x, point1.y, point.x, point.y);
double c = getLenWithPoints(point2.x, point2.y, point.x, point.y);
double a = getLenWithPoints(point1.x, point1.y, point2.x, point2.y);
if (c + b == a) {
length = (double) 0;
} else if (c * c >= a * a + b * b) {
length = b;
} else if (b * b >= a * a + c * c) {
length = c;
} else {
double p = (a + b + c) / 2;
double s = Math.sqrt(p * (p - a) * (p - b) * (p - c));
length = 2 * s / c;
}
return length;
}
}
class MyCircle
{
MyPoint point;
double r;
public MyCircle(MyPoint point,double r){
this.point = point;
this.r = r;
}
public double getArea(){
return r*r*3.14;
}
public void display(){
System.out.println("Circle Center:("+point.x+","+point.y+"),radius="+r+",Area="+getArea());
}
public boolean intersection(LineSeg l1){
if(l1.getDistance(point)<=r)
return true;
else
return false;
}
public void move(double a,double b){
point.x = point.x+a;
point.y = point.y+b;}
public void Center(){
System.out.println("("+point.x+","+point.y+")");
}
}
二、正方形内切圆
---点类4-P128
MyPoint类表示二维平面中的一个点,具有两个double类型属性:
横坐标
纵坐标
并具有一个构造方法(与类同名的方法)和以下普通方法:
1 构造方法:接收两个double型数据作为参数,分别设定为横坐标和纵坐标。
2 display()方法,无参数,输出坐标信息,格式形如"(10.0,20.0)"。
3 getInfo()方法,无参数,返回字符串类型的坐标信息,格式形如"(10.0,20.0)"。
4所有属性的置取方法。
---圆类4-P128
MyCircle类表示二维坐标中的一个圆,具有两个属性:
圆心,MyPoint类型
圆半径,double类型
并具有一个构造方法(与类同名的方法)和两个普通方法:
1 构造方法:接收一个MyPoint类型对象和一个double型数据作为参数,分别设定为圆心和圆半径。
2 getArea()方法,无参数,计算并返回圆面积。
3 display()方法,无参数,输出圆心坐标和圆面积,格式形如"Circle Center:(10.0,20.0),radius=10.0,Area=314.0"。
---正方形类-P144
MySquare类表示二维平面中的一个正方形,具有两个属性:
左下端点,MyPoint类型
边长, double类型
并具有一个构造方法(与类同名的方法)和两个普通方法:
1 构造方法:接收一个MyPoint类型对象和一个double类型变量作为参数,分别设定为相应的属性值。
2 createInCircle()方法,无参数,构造内切圆,返回表示矩形内切圆的MyCircle类型对象。
3 display()方法,无参数,输出左下端点坐标和边长,格式为"start(10,20),side=20"
要求编程实现上面的类,使给定的Test类能正常运行,并实现相应的输出内容。
public class Test{
public static void main(String[] args) {
double side = 100;
MyPoint start = new MyPoint(50,50);
MySquare square = new MySquare(start, side);
System.out.println("square info:");
square.display();
System.out.println("incirle of square info:");
square.createCircle().display();
}
}
【输入形式】
【输出形式】
square info:
start:(50.0,50.0),side=100.0
incirle of square info:
Circle Center:(100.0,100.0),radius=50.0,Area=7850.0
public class Test{
public static void main(String[] args) {
double side = 100;
MyPoint start = new MyPoint(50, 50);
MySquare square = new MySquare(start, side);
System.out.println("square info:");
square.display();
System.out.println("incirle of square info:");
square.createCircle().display();
}
}
class MyPoint {
private double x;
private double y;
public MyPoint(double x, double y) {
this.x = x;
this.y = y;
}
public void setX(double x) {
this.x = x;
}
public double getX() {
return x;
}
public void setY(double y) {
this.y = y;
}
public double getY() {
return y;
}
public void display() {
System.out.println("(" + x + "," + y + ")");
}
public String getInfo() {
return "(" + x + "," + y + ")";
}
}
class MyCircle {
private MyPoint center;
private double radius;
public MyCircle(MyPoint center, double radius) {
this.center = center;
this.radius = radius;
}
public double getArea() {
double c=3.14;
return c * radius * radius;
}
public void display() {
System.out.println("Circle Center:" + center.getInfo() + ",radius=" + radius + ",Area=" + getArea());
}
}
class MySquare {
private MyPoint start;
private double side;
public MySquare(MyPoint start, double side) {
this.start = start;
this.side = side;
}
public MyCircle createCircle() {
double radius = side / 2;
MyPoint center = new MyPoint(start.getX() + radius, start.getY() + radius);
return new MyCircle(center, radius);
}
public void display() {
System.out.println("start:" + start.getInfo() + ",side=" + side);
}
}
三、汽车组和类
一辆Car有(has)四个轮子(Wheels)和一个发动机(Engine)。现在要求用组合方法设计类Car、类Wheel和类Engine.
(1) 类Engine 有字符串属性type记录发动机的型号,
有构造方法,可设置发动机的型号
有方法start()启动引擎(输出下面样例中包含发动机型号和“starts”的字符串)
(2)类Wheel有字符串属性type记录轮胎的型号,有整数类型属性index记录当前轮胎编号(1:front-left,2:front-right,3:back-left,4:back-right),
有构造方法,可设置轮胎的型号和编号
有方法roll()表示轮胎正在转动(输出下面样例中包含轮胎型号、轮胎位置和“rolling”的字符串)
(3)类Car有字符串属性model记录轿车的型号,有属性wheels[]和engine,分别是Wheel类对象数组和Engine类对象
有构造方法,参数是三个字符串,分别表示轿车的型号、轮胎型号和发动机的型号,
有方法changeWheel()可以改变指定轮胎的型号,
有方法start(),先输出下面样例中包含轿车型号和“firing”的字符串,然后调用engine的start(),再调用所有轮胎的roll(),最后显示轿车型号和“running”。
要求编程实现类Car、类Wheel和类Engine,使给定的Test类能正常运行,并实现指定的输出内容。
public class Test
{
public static void main(String[] args){
String wheel="BridgeStone";
String model="BMW";
String engine="Mode L";
Car car1=new Car(model,wheel,engine);
car1.start();
System.out.println("=================");
model="Benz";
engine="Model S";
Car car2=new Car(model,wheel,engine);
car2.changeWheel(2,"Michelin");
car2.start();
}
}
【输入形式】
【输出形式】
【样例输入】
【样例输出】
public class Test {
public static void main(String[] args) {
String wheel = "BridgeStone";
String model = "BMW";
String engine = "Mode L";
Car car1 = new Car(model, wheel, engine);
car1.start();
System.out.println("=================");
model = "Benz";
engine = "Model S";
Car car2 = new Car(model, wheel, engine);
car2.changeWheel(2, "Michelin");
car2.start();
}
}
class Engine {
private String type;
public Engine(String type) {
this.type = type;
}
public void start() {
System.out.println("Engine<" + type + "> starts!");
}
}
class Wheel {
private String type;
private int index;
public Wheel(String type, int index) {
this.type = type;
this.index = index;
}
public void roll() {
System.out.println("Wheel "+ getPositionName(index) +" <"+ type +">"+ " is rolling");
}
private String getPositionName(int index) {
switch (index) {
case 1:
return "front-left";
case 2:
return "front-right";
case 3:
return "back-left";
case 4:
return "back-right";
default:
return "unknown";
}
}
}
class Car {
private String model;
private Wheel[] wheels;
private Engine engine;
public Car(String model, String wheelType, String engineType) {
this.model = model;
this.wheels = new Wheel[4];
for (int i = 0; i < 4; i++) {
wheels[i] = new Wheel(wheelType, i + 1);
}
this.engine = new Engine(engineType);
}
public void changeWheel(int index, String newWheelType) {
wheels[index - 1] = new Wheel(newWheelType, index);
}
public void start() {
System.out.println("Car<" + model + "> is firing!");
engine.start();
for (Wheel wheel : wheels) {
wheel.roll();
}
System.out.println("Car<" + model + "> is running");
}
}
四、线段相交
MyPoint类表示二维平面中的一个点,具有两个double类型属性:
横坐标
纵坐标
并具有一个构造方法(与类同名的方法)和以下普通方法:
1 构造方法:接收两个double型数据作为参数,分别设定为横坐标和纵坐标。
2 display()方法,无参数,输出坐标信息,格式形如"(10.0,20.0)"。
3 getInfo()方法,无参数,返回字符串类型的坐标信息,格式形如"(10.0,20.0)"。
4 所有属性的置取方法。
--线段类-P123
LineSeg类表示二维平面中的一个线段,具有两个MyPoint类型属性:
端点1
端点2
并具有一个构造方法(与类同名的方法)和以下普通方法:
1 构造方法:接收两个MyPoint类型对象作为参数,分别设定为两个端点。
2 intersection ()方法,接收一个LineSeg类型对象作为参数,判断两个线段是否相交并返回true或false。
3 display()方法,无参数,输出线段信息,格式形如"(10.0,20.0)---(10.0,30.0)"。
4 所有属性的置取方法。
要求编程实现上述类,使给定的Test类能正常运行,并实现指定的输出内容。
public class Test{
public static void main(String [] args){
LineSeg line1 = new LineSeg(new MyPoint(50,50), new MyPoint(200,200));
LineSeg line2 = new LineSeg(new MyPoint(0,200), new MyPoint(200, 0));
LineSeg line3 = new LineSeg(new MyPoint(150,150), new MyPoint(200,200));
line1.display();
line2.display();
System.out.println("line1&line2 intersection: "+line1.intersection(line2));
line2.display();
line3.display();
System.out.println("line2&line3 intersection: "+line3.intersection(line2));
}
}
【输入形式】
【输出形式】
(50.0,50.0)---(200.0,200.0)
(0.0,200.0)---(200.0,0.0)
line1&line2 intersection: true
(0.0,200.0)---(200.0,0.0)
(150.0,150.0)---(200.0,200.0)
line2&line3 intersection: false
public class Test {
public static void main(String[] args) {
// MyPoint center = new MyPoint(100,100);
LineSeg line1 = new LineSeg(new MyPint(50, 50), new MyPint(200, 200));
LineSeg line2 = new LineSeg(new MyPint(0, 200), new MyPint(200, 0));
LineSeg line3 = new LineSeg(new MyPint(150, 150), new MyPint(200, 200));
line1.display();
line2.display();
System.out.println("line1&line2 intersection: " + line1.intersection(line2));
line2.display();
line3.display();
System.out.println("line2&line3 intersection: " + line3.intersection(line3));
}
}
class MyPint {
private double x;
private double y;
public MyPint(double x, double y) {
this.x = x;
this.y = y;
}
public void setX(double x) {
this.x = x;
}
public double getX() {
return x;
}
public void setY(double y) {
this.y = y;
}
public double getY() {
return y;
}
public void display() {
System.out.println("(" + x + "," + y + ")");
}
public String getInfo() {
return "(" + x + "," + y + ")";
}
}
class LineSeg {
private MyPint point1;
private MyPint point2;
public LineSeg(MyPint point1, MyPint point2) {
this.point1 = point1;
this.point2 = point2;
}
public void setPoint1(MyPint point1) {
this.point1 = point1;
}
public MyPint getPoint1() {
return point1;
}
public void setPoint2(MyPint point2) {
this.point2 = point2;
}
public MyPint getPoint2() {
return point2;
}
public boolean intersection(LineSeg other) {
return !this.point1.getInfo().equals(other.getPoint1().getInfo())
&& !this.point1.getInfo().equals(other.getPoint2().getInfo())
&& !this.point2.getInfo().equals(other.getPoint1().getInfo())
&& !this.point2.getInfo().equals(other.getPoint2().getInfo());
}
public void display() {
System.out.println(point1.getInfo() + "---" + point2.getInfo());
}
}
以上使较为基础的Java编程,希望能帮到大家,如果以上代码有错误的地方,请私信指正,本人会第一时间改正过来。希望大家多多点赞,谢谢大家。