геометрия — что не так с моим кодом C ++?

Я пытаюсь создать равносторонний треугольник, который выводит на консоль, но мой код, кажется, выводит треугольник в точке 0,0.

Как я могу это исправить?

вот что у меня есть:

Заголовочный файл:

#include "shape.h"#include "vertex.h"#include <list>

// An equilateral triangle
class Triangle : public Shape
{
// the radius provides the length of a side
// and enables a vertex to be plotted from
// which the other two vertices can be derived
// via rotation
int radius;
public:
// constructor
Triangle(Vertex point, int radius = 10);

// calculates and returns a triangle's area
int area();

// calculates and returns a triangle's perimeter
int perimeter();
};

и файл cpp

#include "triangle.h"#include "vertex.h"#include <list>

Triangle::Triangle(Vertex point, int radius) : Shape(point)
{
this->radius = radius;

this->centroid = Vertex(0,0);
vertices.push_back(Vertex(centroid.getY() + radius));
vertices.push_back(Vertex(centroid.getY() + (radius*2)));
vertices.push_back(Vertex(centroid.getX() * cos(120) - centroid.getY() * sin(120),centroid.getY() * cos(120) + centroid.getX() * sin(120)));
vertices.push_back(Vertex(centroid.getX() * cos(240) - centroid.getY() * sin(240),centroid.getY() * cos(240) + centroid.getX() * sin(240)));

this->centroid = point;
}

// returns the area of an equilateral triangle
int Triangle::area()
{
return radius*radius*(sqrt(3)/4);
}

// returns the perimeter of an equilateral triangle
int Triangle::perimeter()
{
return radius *3;
}

Я не уверен, что с этим не так. Я пробовал много разных способов исправить это, но мне не повезло в этом. Может кто-нибудь, пожалуйста, помогите?

0

Решение

Как отмечено в другом ответе, sin а также cos принять их аргументы в радианах, а не в градусах.
Кроме того, ваш конструктор кажется странным. Имейте в виду, что у меня нет всех деталей вашего кода (Vertex, Shape, …), но при условии, что vertices должен содержать три вершины вашего треугольника и Vertex есть конструктор, принимающий три координаты, я бы попробовал что-то вроде этого:

Triangle::Triangle(Vertex point, int radius) : Shape(point)
{
this->radius = radius;
// in any case, you want the traingle to be centered around the point given as input
this->centroid = point;

// we can just avoid calling trigonometric functions at runtime
// also, the values for these particular angles are well-known, so we don't need to call any actual trigonometric functions
static const float COS_60 = 0.5f;
static const float COS_30 = 0.5f * sqrt(3.f);

// compute the length of the side of the triangle based on its radius
// for instance, using any of the six right triangles between the center, a vertice and the projection of the center against one of the sides
const float side = radius * 2.f * COS_30;
// more basic geometry
const float bottomHeight = point.getY() - COS_60 * radius;

// first vertice is right above the center
this->vertices.push_back(Vertex(point.getX(), point.getY() + radius));
// second vertice is at the bottom height, and its X position is offset by half the side
this->vertices.push_back(Vertex(point.getX() + COS_60 * side, bottomHeight));
// same, but in the other direction
this->vertices.push_back(Vertex(point.getX() - COS_60 * side, bottomHeight));

}
0

Другие решения

sin, cosи т. д. используйте радианы, а не градусы.

Также вы устанавливаете свой центроид в жестко запрограммированном 0,0,

4

По вопросам рекламы [email protected]