Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 449

Построить равносторонний треугольник зная координаты его центра

05.03.2026, 16:04. Показов 740. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Как построить равносторонний треугольник зная координаты его центра, т.е. нужен треугольник и точка в его центре. И второй вопрос, если можно, как вывести по ним его имя.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.03.2026, 16:04
Ответы с готовыми решениями:

равносторонний треугольник
Не подскажете, как в qt нарисовать равносторонний треугольник по центру? То есть кликаешь -...

Построить объект по координатам
Не могу никак , пересмотрел огромный масштаб информ. нужно чтобы 3D объект строился по данным...

Треугольник и классы!!!
Подскажите как присвоить значения из одного класса переменной другого класса?? с++

13
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
05.03.2026, 16:28
Цитата Сообщение от GAZot Посмотреть сообщение
Как построить равносторонний треугольник зная координаты его центра
Так можно построить бесконечное множество треугольников.
Цитата Сообщение от GAZot Посмотреть сообщение
как вывести по ним его имя
Кто на ком стоял? Чье имя, куда вывести?

Ответ на Ваш вопрос: зачем мне хододильник если я не курю.
0
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 449
05.03.2026, 17:03  [ТС]
Мне важно понять сам принцип, ну пусть сторона для примера будет равна 10. Ну допустим под треугольником (сбоку, сверху неважно) вывести какое нибудь число.
0
1472 / 487 / 72
Регистрация: 22.09.2023
Сообщений: 1,492
05.03.2026, 17:30
Цитата Сообщение от GAZot Посмотреть сообщение
ну пусть сторона для примера будет равна 10
Чак Норрис досчитал до бесконечности дважды. Одну степень свободы вы убрали, но все еще можно построить бесконечное количество треугольников, повернутых на любой угол относительно центра. Теперь для решения достаточно половины Чака Норриса.
0
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
05.03.2026, 17:43
Цитата Сообщение от GAZot Посмотреть сообщение
пусть сторона для примера будет равна 10
еще основание треугольника может быть повернуто на произвольный угол, Вам какой принцип нужен? Как это матиематически просчитать? Так биссектриссы-высоты-медианы в равностороннем треугольнике имеют ряд свойств и соотношений:
центр треугольника (точнее впиванной в- или описанной около окружности) совпадает с точкой пересечения биссектрисс, также в точке пересечения биссектриссы делятся в соотоношении 1 к 2, то есть если биссектрисса имеет длину 15, то точка пересечения разделит её на два отрезка 5 и 10 соотвественно, длина биссесктриссы связана со стороной по формуле https://www.cyberforum.ru/cgi-bin/latex.cgi?l=\frac{a\sqrt{3}}{2}, где a - сторона, а l - биссектрисса. Исходя из этого, все вершины треугольнка будут расположены на расстоянии https://www.cyberforum.ru/cgi-bin/latex.cgi?r=\frac{a\sqrt{3}}{3} от центра, соотвественно для вывода надписи под треугольником можно использовать длину короткого отрезка биссектриссы https://www.cyberforum.ru/cgi-bin/latex.cgi?d=\frac{a\sqrt{3}}{6} к оторой прибавить высоту шрифта.

Если говорите про программную реализацию уточняйте какими инструментами пользуетесь, есть ли какие-то наброски, что конкретно непонятно?
1
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 449
05.03.2026, 17:44  [ТС]
Да я же говорю мне важно понять принцип построения, угол нужен, пусть 90 будет.
0
 Аватар для 4blK4blPblK
5 / 5 / 0
Регистрация: 01.10.2023
Сообщений: 46
05.03.2026, 17:57
Цитата Сообщение от GAZot Посмотреть сообщение
Мне важно понять сам принцип
Принцип чего?
Рисовать статическую фигуру - переопределить paintEvent() для QWidget.
Если нужен интерактив (взаимодействие мышкой с фигурой или фигур между собой) - QGraphicsView.
Быстро рисовать овердофига фигур - OpenGL.

Добавлено через 5 минут
Цитата Сообщение от GAZot Посмотреть сообщение
Да я же говорю мне важно понять принцип построения, угол нужен, пусть 90 будет.
А причем тут Qt?
Единственно что могу сказать в привязке к Qt - есть QLineF, ее можно повернуть на угол QLineF::setAngle() и получать ее точки.
А так это чисто тригонометрия.
1
1 / 3 / 0
Регистрация: 25.04.2015
Сообщений: 449
05.03.2026, 18:05  [ТС]
что то типа
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
class MyWidget : public QWidget
{
    void paintEvent(QPaintEvent *)
    {
        QPainter painter;
        painter.begin(this);
        painter.drawPolygon({QPointF(?, ?), QPointF(?, ?), QPointF(?, ?)});
        painter.end();
    }
};
?,? - надо рассчитать я так понял, а как точку в центре поставить и надпись добавить
0
 Аватар для Ender Che
518 / 408 / 77
Регистрация: 29.05.2018
Сообщений: 1,339
05.03.2026, 19:54
Цитата Сообщение от GAZot Посмотреть сообщение
как точку в центре поставить и надпись добавить
Точку - drawEllipse с малым радиусом и сплошной заливкой. Текст - drawText.
0
 Аватар для kapbepucm
1567 / 740 / 321
Регистрация: 02.05.2020
Сообщений: 1,659
05.03.2026, 23:34
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QSpinBox>
#include <QLabel>
#include <QPainter>
 
class Triangle: public QWidget
{
public:
  int x0, y0, l;
  Triangle(int x, int y, int l): QWidget{}, x0(x), y0(y), l(l)
  {
    setMinimumWidth(500);
    setMinimumHeight(300);
  }
  void paintEvent(QPaintEvent*)
  {
    QPainter p{this};
    p.setRenderHint(QPainter::Antialiasing, true);
    QBrush brush{Qt::green};
    QPen pen{Qt::red};
    p.setBrush(brush);
    p.setPen(pen);
    p.drawRect(0, 0, width(), height());
 
    qreal radius = l / qSqrt(3.0);
    QPointF points[3];
    for (int i = 0; i < 3; ++i) {
      qreal angle = i * 2.0 * M_PI / 3.0 - M_PI / 2;
      qreal x = x0 + radius * qCos(angle);
      qreal y = y0 + radius * qSin(angle);
      points[i] = QPointF(x, y);
    }
    brush.setColor(Qt::red);
    p.setBrush(brush);
    p.drawPolygon(points, 3);
 
    pen.setColor(Qt::yellow);
    brush.setColor(Qt::yellow);
    p.setBrush(brush);
    p.setPen(pen);
    p.drawEllipse(QPoint{x0, y0}, 5, 5);
 
    QString name{"имя"};
    pen.setColor(Qt::blue);
    p.setPen(pen);
    QFontMetricsF fm(p.font());
    QRectF rect = fm.boundingRect(name);
    QPointF textPoint = QPointF(x0 - rect.width()/2, y0 - rect.height()/2 + radius);
    p.drawText(textPoint, name);
  }
};
 
class Window: public QWidget
{
public:
  Window(): QWidget{}
  {
    QSpinBox* x = new QSpinBox;
    x->setMaximum(1000);
    x->setValue(100);
    QSpinBox* y = new QSpinBox;
    y->setMaximum(1000);
    y->setValue(100);
    QSpinBox* l = new QSpinBox;
    l->setMaximum(1000);
    l->setValue(150);
    QGridLayout* controls = new QGridLayout;
    controls->addWidget(new QLabel{"x координата центра"}, 0, 0);
    controls->addWidget(x, 0, 1);
    controls->addWidget(new QLabel{"y координата центра"}, 1, 0);
    controls->addWidget(y, 1, 1);
    controls->addWidget(new QLabel{"длина стороны"}, 2, 0);
    controls->addWidget(l, 2, 1);
    Triangle* triangle = new Triangle{x->value(), y->value(), l->value()};
    connect(x, &QSpinBox::valueChanged, [triangle, x](){
      triangle->x0 = x->value();
      triangle->update();
    });
    connect(y, &QSpinBox::valueChanged, [triangle, y](){
      triangle->y0 = y->value();
      triangle->update();
    });
    connect(l, &QSpinBox::valueChanged, [triangle, l](){
      triangle->l = l->value();
      triangle->update();
    });
    QHBoxLayout* mainLayout = new QHBoxLayout;
    mainLayout->addWidget(triangle, 1);
    mainLayout->addLayout(controls);
    setLayout(mainLayout);
  }
};
 
int main(int argc, char** argv)
{
  QApplication app{argc, argv};
  Window window;
  window.show();
  return app.exec();
}
1
1 / 1 / 0
Регистрация: 16.12.2025
Сообщений: 32
06.03.2026, 01:49
Цитата Сообщение от GAZot Посмотреть сообщение
?,? - надо рассчитать я так понял, а как точку в центре поставить и надпись добавить
Где то тут рисовали треугольники...
извините
Создать прямоугольный треугольник
[я там забыл градусы перевести в радианы, в конструкторе(он просто не использовался) + комментарии на "отгребись" написал ]
Создаешь треугольник, поворачиваешь на необходимый угол.
Получаешь три точки. Рассчитываешь размер виджета, необходимый прямоугольник.
Изменяешь размер виджета, рисуешь треугольник.

Что нужно добавить в тот код?
1. Конструктор для Евклидового треугольника по стороне(достаточно для равностороннего треугольника).
2. Метод (для общего треугольника) возвращающий координаты точек треугольника.

Показать принцип?
Ну так там, в коде, все принципы уже есть. Геометрия, немного векторной алгебры. И в путь.
Вместо метода Draw, можно создать метод Points() возвращающий координаты трех точек.

Если нужно, могу сделать(уже). Прикрепил.
Мудрено? Да. Это же геометрия/алгебра.
Можно проще, только для одного этого случая.
Хранить точки треугольника + функция вращения точек.
Но если без всего паровоза, создавать такие треугольники будет тяжело, вот так как сейчас у тебя.

Цитата Сообщение от GAZot Посмотреть сообщение
Как построить равносторонний треугольник зная координаты его центра
А нужно от центра плясать? И почему?

p.s. И как видно, в результате, при общем подходе, не нужен никакой прямоугольный, равнобедренный и прочие подклассы треугольников.
p.s.s. И свобода для оптимизации, матрицы поворота и так далее.
p.s.s.s Создаю(на основе прикрепленного кода) равносторонний треугольник с стороной 10пт(пунктов) и углом направленным вверх. Может понадобится функция переноса фигуры в указанную точку, это уже вообще элементарно.
C++
1
2
    Geom::DETriangle t(10, {0,0}, mc::rad(90.0));
    t.Draw();
Code
1
2
3
(0, 0) : (-10, 6.12323e-16)
(-10, 6.12323e-16) : (-5, 8.66025)
(-5, 8.66025) : (0, 0)
Миниатюры
Построить равносторонний треугольник зная координаты его центра  
Вложения
Тип файла: zip triangle.zip (15.2 Кб, 2 просмотров)
1
1 / 1 / 0
Регистрация: 16.12.2025
Сообщений: 32
06.03.2026, 01:59
GAZot, вот, kapbepucm тебе захардкодил
0
 Аватар для 4blK4blPblK
5 / 5 / 0
Регистрация: 01.10.2023
Сообщений: 46
06.03.2026, 03:35
Наподобие решения kapbepucm, только через кутешные QLineF
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <QApplication>
#include <QPainter>
#include <QSlider>
#include <QGridLayout>
#include <QLabel>
#include <QFontMetrics>
 
class Triangle : public QWidget
{
private:
    int rotation{}, radius{};
    const int vertexRadius{3};
 
public:
    using QWidget::QWidget;
 
public slots:
    void setRotation(const int &rot){
        rotation = rot;
        update();
    }
 
    void setEdge(const int &edge){
        radius = edge / qSqrt(3.0);
        QFontMetrics fm(font());
        const auto margin = fm.horizontalAdvance("p0: 000, 000.");
        const int d = 2*radius + 2*margin;
        setMinimumSize(d, d);
        update();
    }
 
protected:
    void paintEvent(QPaintEvent *event){
        QWidget::paintEvent(event);
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
 
        QLineF line;
        const auto center = rect().center();
        line.setP1(center);
        line.setLength(radius);
        line.setAngle(90 + rotation);
 
        QPolygonF points;
        for(int i=0; i<3; i++){
            points<<line.p2().toPoint();
            painter.drawEllipse(points.at(i), vertexRadius, vertexRadius);
            line.setAngle(120 + line.angle());
        }
 
        const auto fontH = font().pointSize() / 2;
 
        painter.drawPolygon(points);
        painter.drawEllipse(center, vertexRadius, vertexRadius);
        painter.drawText(center + QPoint(vertexRadius*2, fontH), QString("%1, %2").arg(center.x()).arg(center.y()));
 
        int i{};
        for(const auto &point : points){
            QString str = QString("p%1: %2, %3").arg(++i).arg(point.x()).arg(point.y());
            if(point.x() > center.x()){
                painter.drawText(point + QPoint(vertexRadius*2, fontH), str);
            }else{
                QFontMetrics fm(font());
                const auto offset = QPoint(-vertexRadius*2 - fm.horizontalAdvance(str), fontH);
                painter.drawText(point + offset, str);
            }
        }
    }
};
 
 
class Window : public QWidget
{
private:
    QLabel *lblRotation, *lblEdge;
    QSlider *sliderRotation, *sliderEdge;
    Triangle *triangle;
 
public:
    Window(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
        :QWidget(parent, f){
        auto layout=new QGridLayout;
        setLayout(layout);
 
        lblRotation = new QLabel("Rotation: 0");
        lblEdge = new QLabel;
 
        sliderRotation = new QSlider(Qt::Horizontal);
        sliderEdge = new QSlider(Qt::Horizontal);
 
        triangle=new Triangle;
 
        layout->addWidget(lblRotation, 0, 0);
        layout->addWidget(sliderRotation, 0, 1);
        layout->addWidget(lblEdge, 1, 0);
        layout->addWidget(sliderEdge, 1, 1);
        layout->addWidget(triangle, 2, 0, 1, 2);
 
        QObject::connect(sliderRotation, &QSlider::valueChanged, this, [this](const int &val){
            triangle->setRotation(val);
            lblRotation->setText(QString("Rotation: %1").arg(val));
        });
 
        QObject::connect(sliderEdge, &QSlider::valueChanged, this, [this](const int &val){
            triangle->setEdge(val);
            lblEdge->setText(QString("Edge: %1").arg(val));
        });
 
        sliderRotation->setRange(0, 360);
        sliderEdge->setRange(50, 500);
    }
};
 
 
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Window w;
        w.show();
        return a.exec();
    }
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,280
09.03.2026, 18:44
Вроде в задании нужно построить равносторонний треугольник произвольного размера (в задании не указано), повернутый на произвольный угол (в задании не указано) вокруг точки - центра. Не проще ли сделать так:

Ставим точку - центр.
Рисуем вокруг точки окружность.
На окружность ставим произвольную точку, и ещё 2 точки, через 120 и 240 градусов. Это и будут точки равностороннего треугольника с центром в центре окружности.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.03.2026, 18:44
Помогаю со студенческими работами здесь

Треугольник
Подскажите пожалуйста!!! Как нарисовать закрашенный треугольник?

Анимация вписанной в треугольник окружности на QGraphicsScene
Собственно, есть сцена, на ней три отрезка, образующих треугольник (объекты класса MyLineItem,...

Треугольник по сторонам
Задача - построить треугольник по заданным сторонам. Есть кусок программы с построением квадрата,...

Нарисовать треугольник
Добрый день! Вот хочу нарисовать в Qt треугольник, и возникли некоторые сложности. Научился...

Описать класс, представляющий треугольник
Описать класс, представляющий треугольник. Предусмотреть методы для создания объектов, вычисления...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru