Jump to content
mirador_22

[Resolvido] Erro no cálculo de vértices de um pentágono inscrito na circunferência de raio r

Recommended Posts

mirador_22

Olá a todos,

eu tenho o seguinte construtor da classe poligono


public Poligono
{
  private int final numeroDeLado;
  private float lado;
  private Ponto2D centro;

}

public Poligono(Ponto2D centro, float lado,int numeroLados) {
		 centro = centro
		 lado = lado;
		 numeroDeLado = numeroLados;
}

eu tenho o seguinte construtor da classe pentágono,

public Pentagono(Ponto2D centro, float lado) extends Poligono{
	super(centro, lado, 5);
}

calcular raio visto, que o pentágono deverá ser inscrito numa circunferência de raio r


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

depois tenho as seguinte formula para calcular os seguinte vertices do pentagono

http://postimg.org/image/m3ujskind/

e depois ao calcular os vertices apartir da formula no seguinte codigo em baixo,

@Override
public List<Ponto2D> getVertices() {

	vertices = new ArrayList<>(numeroDeLado);

	double graus = 360.0 / numeroDeLados;
	double radianos = Math.toRadians(graus);
	float raioCirculo = calcularRaio(lado,numeroDeLado); // onde usar o raio

	Ponto2D p1 = new Ponto2D(
			(float) ((1/4 * (1 + Math.sqrt(5)) * lado * Math.cos(radianos)) + (1/4 * (1 + Math.sqrt(5)) * lado)  * Math.sin(radianos)) + mCentro.getX(),
			(float)  mCentro.getY()
	);
	vertices.add(p1);

	p1 = new Ponto2D(
			(float) mCentro.getX(),
			(float) (((Math.sqrt(1/10) * (5 + Math.sqrt(5)) * lado) * Math.sin(radianos)) - (Math.sqrt(1/10) * (5 + Math.sqrt(5)) * lado) * Math.cos(radianos)) + mCentro.getY()
	);
	vertices.add(p1);

	p1 = new Ponto2D(
			(float) ((1/4 * ( - 1 - Math.sqrt(5)) * lado * Math.cos(radianos)) - (1/4 * (-1 - Math.sqrt(5)) * lado)  * Math.sin(radianos)) + mCentro.getX(),
			(float)  mCentro.getY()
	);
	vertices.add(p1);

	p1 = new Ponto2D(
			(float) (((-lado / 2) * Math.cos(radianos)) - (lado / 2) * Math.sin(radianos)) + mCentro.getX(),
			(float) ((((-1/2 * Math.sqrt(1 + 2 / Math.sqrt(5))) * lado) * Math.sin(radianos)) - (-1/2 * Math.sqrt(1 + 2 / Math.sqrt(5))) * lado * Math.cos(radianos))+ mCentro.getY()
	);
	vertices.add(p1);

	p1 = new Ponto2D(
			(float) (((lado / 2) * Math.cos(radianos)) - (lado / 2) * Math.sin(radianos)) + mCentro.getX(),
			(float) ((((-1/2 * Math.sqrt(1 + 2 / Math.sqrt(5))) * lado) * Math.sin(radianos)) - (-1/2 * Math.sqrt(1 + 2 / Math.sqrt(5))) * lado * Math.cos(radianos)) + mCentro.getY()
	);
	vertices.add(p1);

	return vertices;
}

só que quando testo o programa no main e o resultado não sai igual a formula

C->[0.00,0.00]->[0.00,0.00]->[0.00,0.00]->[-3.15,0.00]->[-1.61,0.00];

Alguma ajuda ou dica, eu agradeceria

Edited by mirador_22

Share this post


Link to post
Share on other sites
HappyHippyHippo

Alguma ajuda ou dica, eu agradeceria

o código que te apresentei num outro tópico faz exactamente o que o nome do tópico faz : "calculo de vertices de um pentagono inscrito na circunferencia de raio r" através de um método muito mais simples.

Qual a razão de utilizar essa fórmula ?

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mirador_22

eu pretendo usar esse calculo porque de facto, o outro método genérico dá para calcular os vértices dos polígonos regulares mas o problema é qua alguns cálculos de vértices, não está saindo correto, por isso optei por fazer pela formula, houve muitas alterações no projeto, e acabei optando pelo calculo dos vertices pela formula

Edited by mirador_22

Share this post


Link to post
Share on other sites
HappyHippyHippo

o outro método dá e funciona correctamente para o cálculo dos vértices dos poligonos inscritos numa circunferência.

para o cálculo dos vértices dos restantes, basta fazer override da função e aplicar o método apropriado para o caso particular

como um pentágono recai sobre o primeiro caso, todo este tópico é irrelevante


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mirador_22

como houve algumas alterações no projeto, com a ajuda do prof, conseguimos fazer assim,

public abstract class PoligonoRegular extends Poligono {

protected int numeroDeLados;
   protected float lado;


protected PoligonoRegular(Ponto2d centro, float lado, int numeroDeLados) {

	super(centro);
this.lado=lado
	if (numeroDeLados < 3) {
		throw new IllegalArgumentException("Número inválido de lados. Por favor introduza um número maior ");
	}
	this.numeroDeLados = numeroDeLados;
	listaVertices = new ArrayList(numeroDeLados);
	float raioCirculo = calculaRaio(lado, numeroDeLados);
	float calculaAngulo = 360 / numeroDeLados;
	Ponto2d verticeTopo = new Ponto2d(centro.x, centro.y + raioCirculo);
	if (numeroDeLados % 2 == 0) //numero par de lados tem que rodar para ficar com o lado de baixo horizontal
	{
		verticeTopo = rodar(centro, verticeTopo, calculaAngulo / 2.0F);
	}
	listaVertices.add(verticeTopo);		 //adiciona pontos/vertices á lista de arrays pra completar a figura
	for (int i = 1; i < numeroDeLados; i++) {
		verticeTopo = rodar(centro, verticeTopo, calculaAngulo);
		listaVertices.add(verticeTopo);
	}
}


public class Triangulo extends PoligonoRegular {
public Triangulo(Ponto2d centro, float lado) {
	super(centro, lado, 3);
}

mas o nosso problema recai em calcular o método para rodar dois pontos de eixo, tal como está indicado em baixo

verticeTopo = rodar(centro, verticeTopo, calculaAngulo);

private Ponto2D rodar(Ponto2D centro, Ponto2D verticeTopo, float graus) {

}


mas optamos por criar uma método aparte para calcular os vertices

Edited by mirador_22

Share this post


Link to post
Share on other sites
mirador_22

Eu consigui fazer assim, como está indicado em baixo,

public Ponto2D rodar2Ponto(Ponto2D centro, Ponto2D verticeTopo, float graus) {

	double radianos = Math.toRadians(graus);
	double dx = (centro.mX - verticeTopo.mX);
	double dy = (centro.mY - verticeTopo.mY);

	centro.mX = (float) (verticeTopo.mX + (dx * Math.cos(radianos) - dy * Math.sin(radianos)));
	centro.mY = (float) (verticeTopo.mY + (dx * Math.sin(radianos) + dy * Math.cos(radianos)));

	return centro;
}


private float calcularRaio(float lado, int numeroDeLado) {
	float raio = (float) (lado / 2 * Math.sin(Math.PI / numeroDeLado));
	return raio;
}


public List<Ponto2D> getVertices() {

	vertices = new ArrayList(numeroDeLados);
	float raioCirculo = calcularRaio(lado, numeroDeLados);
	float calculaAngulo = 360 / numeroDeLados;
	Ponto2D verticeTopo = new Ponto2D(mCentro.getX(), mCentro.getY() + raioCirculo);

	if (numeroDeLados % 2 == 0) //numero par de lados tem que rodar para ficar com o lado de baixo horizontal
	{
		verticeTopo = rodar2Ponto(mCentro, verticeTopo, calculaAngulo / 2.0F);
	}

	vertices.add(verticeTopo);		  //adiciona pontos/vertices á lista de arrays pra completar a figura
	for (int i = 1; i < numeroDeLados; i++) {
		verticeTopo = rodar2Ponto(mCentro, verticeTopo, calculaAngulo);
		vertices.add(verticeTopo);
	}
  return vertices;
}

está a funcionar mas os cálculos que aparecem no output não está correto tipo assim

um output de um triângulo inscrito numa circunferência raio r e 10 cm de lado

seria

j: (0,00, 5,77) -> (-5,00, -2,89) -> (5,00, -2,89)

clica aqui para ver o desenho

http://www.wolframalpha.com/input/?i=listplot[[0.00,5.77],[-5.00,-2.89],[5.00,-2.89],[0.00,5.77]]

mas no meu output:

[[0.00,4.33],[3.75,6.50],[3.75,6.50],[0.00,4.33]]

http://www.wolframalpha.com/input/?i=listplot[[0.00,4.33],[3.75,6.50],[3.75,6.50],[0.00,4.33]]

Edited by mirador_22

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.