Как нарисовать правильные кривые логических элементов (формы ИЛИ/НЕ), используя квадратичные кривые Безье в wxWidgets?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как нарисовать правильные кривые логических элементов (формы ИЛИ/НЕ), используя квадратичные кривые Безье в wxWidgets?

Сообщение Anonymous »

Я разрабатываю инструмент для проектирования и моделирования цифровых схем, похожий на Logisim, и изо всех сил стараюсь визуализировать характерную изогнутую форму логических элементов, таких как элементы ИЛИ/НЕ. Несмотря на многочисленные попытки с параметрами кривой Безье, мне не удалось добиться классической формы «заостренного овала», показанной на стандартных схемах.
Текущий технический подход (детальная реализация)
Моя архитектура состоит из двух основных компонентов, которые работают вместе для рендеринга логических элементов из определений JSON:
0. Система определения формы
Каждый компонент определяется в файле JSON (

Код: Выделить всё

canvas_elements.json
) с использованием примитивных фигур:

Код: Выделить всё

{
"id": "OR_Gate",
"name": "OR Gate",
"anchorPoint": [80, 60],
"shapes": [
{
"type": "BezierShape",
"p0": {"x": 43, "y": 20},
"p1": {"x": 85, "y": 24},
"p2": {"x": 110, "y": 60},
"color": "#333333"
},
{
"type": "BezierShape",
"p0": {"x": 43, "y": 100},
"p1": {"x": 85, "y": 96},
"p2": {"x": 110, "y": 60},
"color": "#333333"
},
{
"type": "BezierShape",
"p0": {"x": 43, "y": 20},
"p1": {"x": 60, "y": 60},
"p2": {"x": 43, "y": 100},
"color": "#333333"
}
]
}
Важный контекст. Параметры Безье в моих файлах JSON являются результатом кропотливой ручной настройки в течение многих часов. Инструментов для визуальной отладки этих параметров я не нашел; это чисто метод проб и ошибок: постепенная корректировка в зависимости от того, выглядит ли нарисованная форма более «стандартной». Каждая настройка требует перекомпиляции и запуска программы, чтобы увидеть эффект, что крайне неэффективно.
1. CanvasModel: анализ JSON и фабрика элементов (

Код: Выделить всё

CanvasModel.h
)[/b] Заголовок CanvasModel.h определяет функцию загрузчика, которая считывает мой файл Canvas_elements.json и создает объекты CanvasElement:

Код: Выделить всё

 // CanvasModel.h - JSON deserialization entry point
 #pragma once
 #include 
 #include 
 #include   
 ​
 class CanvasElement;
 ​
 // Global function: JSON -> CanvasElement list
 std::vector LoadCanvasElements(const wxString& jsonPath);
Эта функция анализирует массив JSON, создает экземпляр CanvasElement для каждого определения вентиля и вызывает метод AddShape() элемента для заполнения его внутреннего хранилища форм.
2. CanvasElement: хранилище фигур и механизм рендеринга Безье (

Код: Выделить всё

CanvasElement.h
)[/b] Заголовок CanvasElement.h определяет полные структуры данных и конвейер рендеринга:

Код: Выделить всё

 // CanvasElement.h - Core shape storage and Bezier math
 #pragma once
 #include 
 #include 
 #include 
 #include 
 #include 
 ​
 struct Point { int x, y; };
 ​
 // Quadratic Bezier curve definition (loaded directly from JSON)
 struct BezierShape {
     Point p0, p1, p2;
     wxColour color;
     BezierShape(Point p0 = Point(), Point p1 = Point(), Point p2 = Point(),
                 wxColour c = wxColour(0, 0, 0))
         : p0(p0), p1(p1), p2(p2), color(c) {}
 };
 ​
 // Shape variant that stores all drawable primitives
 using Shape = std::variant[*];
 ​
 class CanvasElement {
 private:
     std::vector m_shapes;  // All shapes for this element, including Bezier curves
     
     // Core Bezier math: samples quadratic curve into polyline
     std::vector CalculateBezier(const Point& p0, const Point& p1,
                                          const Point& p2, int segments = 16) const {
         std::vector points;
         for (int i = 0; i 

Подробнее здесь: [url]https://stackoverflow.com/questions/79849486/how-to-draw-proper-logic-gate-curves-or-nor-shapes-using-quadratic-bezier-curv[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»