1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
| package labka9;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class lab9 {
public static void main(String[] args) {
List<StraightLine> listLines = new ArrayList<>();
listLines.add(new StraightLine(2, -1, -3));
listLines.add(new StraightLine(-3, -1, 2));
listLines.add(new StraightLine(-3, -1, 2));
listLines.add(new StraightLine(-3, -1, 2));
listLines.add(new StraightLine(-3, -1, 4));
listLines.add(new StraightLine(-3, -1, 5));
listLines.add(new StraightLine(-1, -1, 4));
listLines.add(new StraightLine(-1, -1, 5));
//печатаем все уравнения прямых и их точки пересечения с осями X и Y
for (StraightLine line : listLines) {
System.out.printf("Прямая: %s;%s", line, System.lineSeparator());
System.out.printf("Точки пересечения с осями: %s, %s;%s",
line.getPointIntersectionWithX(), line.getPointIntersectionWithY(), System.lineSeparator());
System.out.println();
}
//ищем пересечения прямых друг с другом (первые 2 из списка)
System.out.println("Точки пересечения 2-х прямых:");
System.out.printf("%s;%s%s;%s", listLines.get(0), System.lineSeparator(), listLines.get(1), System.lineSeparator());
System.out.printf("%s%s", listLines.get(0).getPointIntersectionLines(listLines.get(1)), System.lineSeparator());
System.out.println();
//объеденяем в группы параллельности прямых
Map<StraightLine, List<StraightLine>> groups = getGroupsParallel(listLines);
//печатаем группы параллельности
for (Map.Entry<StraightLine, List<StraightLine>> group : groups.entrySet()) {
if (group.getValue().size() > 0) {
System.out.printf("Прямая %s параллельна с:%s", group.getKey(), System.lineSeparator());
for (StraightLine line : group.getValue()) {
System.out.printf(" %s;%s", line, System.lineSeparator());
}
System.out.println();
}
}
}
public static Map<StraightLine, List<StraightLine>> getGroupsParallel(List<StraightLine> list) {
Map<StraightLine, List<StraightLine>> map = new HashMap<>();
if (list != null && !list.isEmpty()) {
boolean flag;
while (!list.isEmpty()) {
flag = false;
StraightLine line = list.remove(0);
for (StraightLine lineMap : map.keySet()) {
if (lineMap.isParallel(line)) {
map.get(lineMap).add(line);
flag = true;
break;
}
}
if (!flag) {
map.put(line, new ArrayList<>());
}
}
}
return map;
}
}
class StraightLine {
private int a;
private int b;
private int c;
public StraightLine(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
public String getPointIntersectionWithX() {
return String.format("{%.2f, 0}", -this.c / this.a);
}
public String getPointIntersectionWithY() {
return String.format("{0, %.2f}", -this.c / this.b);
}
public boolean isParallel(StraightLine line) {
double coeffOne = this.a / line.a;
double coeffTwo = this.b / line.b;
double coeffThree = this.c / line.c;
return coeffOne == coeffTwo && coeffOne != coeffThree;
}
public boolean isEquals(StraightLine line) {
double coeffOne = this.a / line.a;
double coeffTwo = this.b / line.b;
double coeffThree = this.c / line.c;
return coeffOne == coeffTwo && coeffOne == coeffThree;
}
public String getPointIntersectionLines(StraightLine line) {
String result = null;
if (line != null) {
if (isEquals(line)) {
result = "Прямые равны. Имеют бесконечное множество точек пересечения.";
} else if (isParallel(line)) {
result = "Прямые параллельны. Точек пересечения нет.";
} else {
double y = (line.a * this.c - this.a * line.c) / (this.a * line.b - line.a * this.b);
double x = (this.b * y + this.c) / -this.a;
result = String.format("Точка пересечения: {%.2f, %.2f};", x, y);
}
}
return result;
}
@Override
public String toString() {
String result = getBlock(this.a, "x", true);
result = result.concat(getBlock(this.b, "y", this.a == 0));
result = result.concat(getBlock(this.c, "", this.a == 0 && this.b == 0));
return result.concat(" = 0");
}
private String getBlock(int number, String prefix, boolean first) {
String result = "";
if (number != 0) {
if (first) {
result = String.format("%d%s", number, prefix);
} else {
String sign = number < 0 ? "-" : "+";
result = String.format(" %s %d%s", sign, Math.abs(number), prefix);
}
}
return result;
}
} |