This commit is contained in:
Victor 2014-03-04 13:22:18 +02:00
parent eb1c2dd6e5
commit 42a98aa282

99
src/gm/LR_3.java Normal file
View 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);
}
}
}