From 42a98aa28279cc73e35922c882260c3a15f99a71 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 4 Mar 2014 13:22:18 +0200 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=A03?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gm/LR_3.java | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/gm/LR_3.java diff --git a/src/gm/LR_3.java b/src/gm/LR_3.java new file mode 100644 index 0000000..174eb9f --- /dev/null +++ b/src/gm/LR_3.java @@ -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 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 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); + } + } +}