ЛР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