ЛР3
This commit is contained in:
parent
eb1c2dd6e5
commit
42a98aa282
99
src/gm/LR_3.java
Normal file
99
src/gm/LR_3.java
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
package gm;
|
||||||
|
|
||||||
|
import com.annimon.graphics.Application;
|
||||||
|
import com.annimon.graphics.GraphicsExt;
|
||||||
|
import com.annimon.graphics.Point;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.StreamTokenizer;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Вариант 11(тут 1)
|
||||||
|
* @author aNNiMON
|
||||||
|
*/
|
||||||
|
public class LR_3 extends Application {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
ArrayList<Point> points = new ArrayList<>();
|
||||||
|
StreamTokenizer streamTokenizer = new StreamTokenizer(new FileReader("lr3.txt"));
|
||||||
|
// StreamTokenizer streamTokenizer = new StreamTokenizer(new InputStreamReader(System.in));
|
||||||
|
streamTokenizer.nextToken();
|
||||||
|
while (streamTokenizer.ttype != StreamTokenizer.TT_EOF) {
|
||||||
|
double x = streamTokenizer.nval;
|
||||||
|
streamTokenizer.nextToken();
|
||||||
|
double y = streamTokenizer.nval;
|
||||||
|
streamTokenizer.nextToken();
|
||||||
|
|
||||||
|
points.add(new Point(x, y));
|
||||||
|
}
|
||||||
|
new LR_3(points);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Point[] input;
|
||||||
|
|
||||||
|
public LR_3(ArrayList<Point> points) {
|
||||||
|
super(640, 480);
|
||||||
|
setTitle("LR_3 v1");
|
||||||
|
this.input = points.toArray(new Point[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void paint(GraphicsExt g) {
|
||||||
|
if (input == null) return;
|
||||||
|
final int length = input.length;
|
||||||
|
final int smoothFactor = 25;
|
||||||
|
|
||||||
|
// Рисуем заданные точки
|
||||||
|
g.setColor(Color.RED);
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
g.rect(input[i].getX() - 0.01, input[i].getY() - 0.01, 0.03, 0.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Рисуем сглаженную кривую
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
Point[] abcdPoints = new Point[4];
|
||||||
|
Interpolator interpolator = new Interpolator();
|
||||||
|
boolean first = true;
|
||||||
|
for (int i = 1; i < length - 2; i++) {
|
||||||
|
System.arraycopy(input, i - 1, abcdPoints, 0, abcdPoints.length);
|
||||||
|
interpolator.interpolate(abcdPoints);
|
||||||
|
for (int j = 0; j < smoothFactor; j++) {
|
||||||
|
double t = j / (double) length;
|
||||||
|
Point xy = interpolator.getPoint(t);
|
||||||
|
if (first) {
|
||||||
|
g.move(xy);
|
||||||
|
first = false;
|
||||||
|
} else g.draw(xy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Interpolator {
|
||||||
|
double a0, a1, a2, a3;
|
||||||
|
double b0, b1, b2, b3;
|
||||||
|
|
||||||
|
private void interpolate(Point[] p) {
|
||||||
|
interpolate(p[0], p[1], p[2], p[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void interpolate(Point A, Point B, Point C, Point D) {
|
||||||
|
a3 = (-A.getX() + 3 * (B.getX() - C.getX()) + D.getX()) / 6d;
|
||||||
|
b3 = (-A.getY() + 3 * (B.getY() - C.getY()) + D.getY()) / 6d;
|
||||||
|
a2 = (A.getX() - 2 * B.getX() + C.getX()) / 2d;
|
||||||
|
b2 = (A.getY() - 2 * B.getY() + C.getY()) / 2d;
|
||||||
|
a1 = (C.getX() - A.getX()) / 2d;
|
||||||
|
b1 = (C.getY() - A.getY()) / 2d;
|
||||||
|
a0 = (A.getX() + 4 * B.getX() + C.getX()) / 6d;
|
||||||
|
b0 = (A.getY() + 4 * B.getY() + C.getY()) / 6d;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Point getPoint(double t) {
|
||||||
|
double x = ((a3*t + a2)*t + a1) * t + a0;
|
||||||
|
double y = ((b3*t + b2)*t + b1) * t + b0;
|
||||||
|
return new Point(x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user