Draw Regular Polygons inscribed on a circumference with Canvas in JavaFX

2

If you notice correctly, this is a method that I developed to create the vertices of regular polygons inscribed on a circle of radius r

@Override
    public float calcularRaio(float lado, int numeroLados) {// calcular raio
        float raio = (float) (lado / (2 * Math.sin(Math.PI / this.getmNLados())));
        return raio;
    }

    @Override
    public float getRaio() {//obter o valor do raio
        return calcularRaio(this.getLados(), this.getmNLados());
    }

public List<Ponto2D> getVertices() {//obter os vertices

        vertices = new ArrayList<>(mNLados);

        double calcularAngulo = 360.0 / mNLados;
        Ponto2D pontoCriado = new Ponto2D(super.getmCentro().getmX(), super.getmCentro().getmY() + this.getRaio());//(0,r)

        if (mNLados % 2 == 0) //numero par de lados tem que rodar para ficar com o lado de baixo horizontal
        {
            pontoCriado = rodarPonto2D(pontoCriado, super.getmCentro(), calcularAngulo / 2.0F);
        }
        vertices.add(pontoCriado);          //adiciona pontos/vertices á lista de arrays pra completar a figura
        for (int i = 1; i < mNLados; i++) {
            pontoCriado = rodarPonto2D(pontoCriado, super.getmCentro(), calcularAngulo);
            vertices.add(pontoCriado);
        }
        return vertices;
    }

    public Ponto2D rodarPonto2D(Ponto2D pontoInicial, Ponto2D pontoCentral, double angulo) {

        double anguloRadiano = Math.toRadians(angulo);
        double coseno = Math.cos(anguloRadiano);
        double seno = Math.sin(anguloRadiano);

        double dx = (pontoInicial.getmX() - pontoCentral.getmX());
        double dy = (pontoInicial.getmY() - pontoCentral.getmY());

        float mX = (float) (pontoCentral.getmX() + (dx * coseno - dy * seno));
        float mY = (float) (pontoCentral.getmY() + (dx * seno + dy * coseno));

        pontoInicial = new Ponto2D(mX, mY);

        return pontoInicial;
    }

And my doubt is here in this method to drawPoligonosRegulares using Canvas, I used the same logic that I used in the getVertices () method and it is not working

public void desenharPoligonosRegulares(GraphicsContext gc) {

        float raio = (float) (this.lados / (2 * Math.sin(Math.PI / this.mNLados)));//calcula o raio
        double calcularAngulo = 360.0 / mNLados;//calcula o angulo

        gc.beginPath();
        gc.moveTo(raio * Math.cos(0), raio * Math.sin(0));//é o mesmo que ter (raio, 0)
        gc.setFill(Color.Black);
        gc.setStroke(Color.Black);
        gc.setLineWidth(1.5);

        for (int i = 1; i < this.mNLados; i++) {
            gc.lineTo(raio * Math.cos(calcularAngulo * i), raio * Math.sin(calcularAngulo * i));
        }

        gc.closePath();
        gc.fill();
        gc.stroke();
    }
    
asked by anonymous 15.06.2014 / 17:21

1 answer

2

The methods Math.sin and Math.cos accept parameters in < strong> radians . You are passing them in degrees . In your first code this is taken into account:

double anguloRadiano = Math.toRadians(angulo);

But in the second no.

double calcularAngulo = 360.0 / mNLados;//calcula o angulo

...

for (int i = 1; i < this.mNLados; i++) {
    gc.lineTo(raio * Math.cos(calcularAngulo * i), raio * Math.sin(calcularAngulo * i));
}

To solve, just do the same in the second code:

double calcularAngulo = 360.0 / mNLados;//calcula o angulo

...

for (int i = 1; i < this.mNLados; i++) {
    gc.lineTo( raio * Math.cos(Math.toRadians(calcularAngulo * i)), 
               raio * Math.sin(Math.toRadians(calcularAngulo * i)) );
}

or, alternatively, use Radians right away:

double calcularAngulo = Math.toRadians(360.0 / mNLados);//calcula o angulo

// ou:

double calcularAngulo = 2*Math.PI / mNLados;//calcula o angulo
    
16.06.2014 / 05:38