Как нарисовать двойную архимедову спираль? - PullRequest
2 голосов
/ 07 марта 2019

По словам нашего учителя, это изображение представляет собой архимидическую спираль: archimidean

Проблема в том, что в Интернете я ищу способы нарисовать архимидическую спираль и нахожу только что-то вродеэто: enter image description here

Так что я понятия не имею, как нарисовать что-то вроде первого изображения, я уже пытался построить спираль таким образом, а затем поставить ту же спирально с другой стороны, но это не сработало, я использовал код из Java: нарисуйте круговую спираль, используя drawArc

public class ArchimideanSpiral extends JFrame {

    public ArchimideanSpiral()
    {
        super("Archimidean Spiral");
        setSize(500,500);
        setVisible(true);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }
    public void paint(Graphics g)
    {
         int x = getSize().width / 2 - 10;
    int y = getSize().height/ 2 - 10;
    int width = 20;
    int height = 20;
    int startAngle = 0;
    int arcAngle = 180;
    int depth = 10;
    for (int i = 0; i < 10; i++) {
        width = width + 2 * depth;
         y = y - depth;
        height = height + 2 * depth;
        if (i % 2 == 0) {



            g.drawArc(x, y, width, height, startAngle, -arcAngle);
        } else {

            x = x - 2 * depth;
            g.drawArc(x, y, width, height, startAngle, arcAngle);
        }
    }









            }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        new ArchimideanSpiral();
    }

}

Но если я попытаюсь поставить тот жеСпираль в обратном направлении не работает, поэтому я заблудился.

1 Ответ

2 голосов
/ 08 марта 2019

Уловка, которую я бы использовал для реализации, заключалась бы в использовании directionMuliplier, чтобы заставить спираль двигаться в разных направлениях (по часовой стрелке / против часовой стрелки) для каждой части.Используется для настройки значений x / y точек на спирали.Например, значение в правом верхнем углу центральной точки в одной спирали станет левым нижним краем в другой.

private Point2D getPoint(double angle, int directionMuliplier) {
    double l = angle*4;
    double x = directionMuliplier * Math.sin(angle)*l;
    double y = directionMuliplier * Math.cos(angle)*l;
    return new Point2D.Double(x, y);
}

Так можно вызвать этот метод для получения GeneralPath, который можно использоватьв методе краски.

GeneralPath gp = new GeneralPath();

gp.moveTo(0, 0);
// create the Archimmedian spiral in one direction
for (double a = 0d; a < Math.PI * 2 * rotations; a += step) {
    Point2D p = getPoint(a, 1);
    gp.lineTo(p.getX(), p.getY());
}

gp.moveTo(0, 0);
// now reverse the direction
for (double a = 0d; a < Math.PI * 2 * rotations; a += step) {
    Point2D p = getPoint(a, -1);
    gp.lineTo(p.getX(), p.getY());
}

Вот как это может выглядеть:

enter image description here

...