Как сделать сердечко в опенскад
Перейти к содержимому

Как сделать сердечко в опенскад

Подвешиваем CD-диск, или практический пример моделирования на базе OpenSCAD для 3д печати

В данной статье я бы хотел поделиться опытом использования бесплатной программы OpenSCAD, для 3д моделирования предоставленной на картинке фигурки.

Будет показан пошагово весь путь моделирования и готовая, напечатанная 3д деталька в конце.

С помощью этой детальки можно подвесить сд-диск на нитке. Пользы для человечества планеты не так много, но благодаря решению этой хобби-задачи я (впервые) попробовал OpenSCAD, и за пол-часа «с нуля» нарисовал 3д модель.

OpenSCAD — это бесплатная и открытая программа для 3д моделирования, но в отличие от других 3д программ, мышка в ней используется только лишь для просмотра готовой детали, а само рисование происходит на базе составленной программы на языке OpenSCAD.

Суть программы на языке OpenSCAD достаточно простая — в ней мы даем команды на рисование геометрических примитивов, над которыми мы можем выполнять операции вращения, перемещения, масштабирования. И плюсом к этому можем осуществлять «арифметические» команды над фигурами, например, сложение, вычитание.

Простая иллюстрация идеи:

И мы получим такой результат:

Установка OpenSCAD

Для установки — скачиваем версию для вашей ОС с официального сайта (http://www.openscad.org/). В данный момент версия от 03.2014.

После старта программы мы увидим 2 области:

Cлева — для ввода программы на языке OpenSCAD,
Cправа — результат отрисовки.

Для отрисовки программы надо нажать F5, для полноценного рендеринга — F6.

Отмечу, что при открытии файла — его не обязательно редактировать в среде OpenSCAD, вы можете его редактировать в вашем любимом текстовом редакторе, для отрисовки в опенскад при редактировании внешним редактором — необходимо нажимать F4.

Hello World

Попробуем нарисовать куб: cube();

Пишем в левой, текстовой зоне (10 — это сторона куба):

Обратим внимание, что каждая строчка в программе заканчивается точкой с запятой.

Нажимаем F5, видим справа — куб — можем вращать его захватив мышкой, роликом увеличивать/уменьшать, и правая кнопка для перемещения точки просмотра.

И попробуем нарисовать сферу, команда: sphere(10)

Просматриваем результат F5:

Теперь добавим команда вычитания:

Команды пишутся как вызов функции, если параметров нет, то пустые скобки, и далее те объекты или объект к которым надо применить эту функцию.

Вот как будет выглядеть вычитание

И вот результат:

Основы думаю понятны.

Теперь вернемся к нашей основной задаче.

Моделирование подвеса

Чтобы CD-диск висел на нити, в горизонтальном положении:

  1. Должно быть что-то куда можно закрепить нить
  2. Диск должен на что-то опираться
  3. Точка крепления нити должна быть по центру диска, при взгляде сверху, и должна быть выше плоскости при взгляде сбоку

Начнем с точки крепления нити, а точнее того, что находится между ней и основанием диска.

Моделирование крестовины

Я решил выполнить этот фрагмент в виде крестовины, которая вверх идет как усеченная пирамида.

Ок, в начале делаем крестовину.

Для этого рисуем два прямоугольный параллелепипеда, перпендикулярные друг другу.

Примечание: для простоты текста — буду называть «прямоугольный параллелепипеда» — «кубоид», то есть это вариация куба.

При рисовании фигур, по умолчанию они идут от центра, в положительные стороны осей X, Y, Z. Это можно увидеть в нашем первом примере — и куб был нарисован в положительной зоне (тогда как сфера изначально рисуется в центре координат).

Но есть вариант, когда центр нарисованной фигуры будет находиться в центре координат. Для этого надо использовать атрибут,
center = true .

Настал момент задуматься о размерах. Диаметр внутреннего отверстия CD-диска — 15 мм. Значит крестовина внизу должна быть не более 15 мм, для запаса возьмем 14 мм.

Первая часть крестовины:

Получилось:

Если мы указываем каждую стенки «куба», то мы должны использовать запись [x, y, z] , вторым параметром (center=true) мы указали что «кубоид» будет нарисован в центре координат.

Мы указали:
14 — это ширина «кубоида» — оно должно быть не больше 15 мм — внутреннего отверстия CD-ROM диска.
1 — толщина стенки,
15 — это высота «кубоида», т.к. он по центру Z, то в верхней части будет 15/2 = 7.5 мм — это будет высота до точки крепления.

Далее нам нужна вторая часть крестовины, для этого нам нужно тот же «кубоид» повернуть на 90 градусов, относительно оси Z.

Функция поворота выглядит как: rotate(a = deg, v = [x, y, z])

Где в параметрах функции указывается угол поворота (a), и вектор (v) относительно которого поворот совершается.

Вот так будет выглядеть программа:

И результат

Теперь нам надо убрать лишнюю часть, что находится под нулевой плоскостью (внизу).

Для этого мы можем нарисовать внизу куб, и вычесть его из нашей фигуры. Но куб будет нарисован в центре, нам необходимо сдвинуть его вниз.

Команда перемещения выглядит так: translate(v = [x, y, z])

Где в параметрах указывается вектор (v) на который необходимо сдвинуть объект (указанный в теле функции).

Куб рисуем со стороной 15 мм, и сдвигаем вниз на 15/2 мм (да можно указывать математические операции) — он оказывается полностью под плоскостью.

Вот обновленный код:

И вот результат:

Теперь применяем уже известную нам команду вычитания — нам надо вычесть из крестовины, куб. Но проблема — для вычитания нужно два объекта — у нас три — два «кубоида» (крестовина), и куб.

Для этого используем команду объединения: union() < OBJ1; OBJ2; . >.

Получается следующий код (с объединением и вычитанием):

Результат

Крестовина получилась, теперь надо сделать ее пирамидальной.

Для этой цели нам бы подошел конус, и операция «пересечения» когда остается лишь та часть фигур, которая совпадает у обоих фигур.

Но команды для рисования конуса нет в OpenSCAD.

Зато есть команда рисования цилиндра: cylinder(h = 10, r = 10, [r2 = 20,]);

где кроме базовых двух параметров (для получения цилиндра) — радиус основания [r] и высоты [f] есть третий [r2] — радиус вершины, с помощью которого можно нарисовать конус, если выставить в 0. Или усеченный конус — если выставить значение не равное радиусу основания.

Это то, что нам нужно.

Определимся с размерами, основание конуса в диаметре должно быть 14, то есть радиус 7. Высота 15/2 мм. Радиус верхнего основания пусть будет 1мм, сам размер будет 2мм, на нем мы разместим ушко для нити.

Мы будем рисовать конус в центре координат, поэтому надо будет поднять вверх на половину высоты (15/4).

Вот как он выглядит:

И результат:

Обратим внимание, что из-за нарисованного конуса мы не видим, что внутри. В OpenSCAD, можно для режима просмотра делать выбранные фигуры полупрозрачные, для этого надо в начале строки, перед командой добавить «%».

И что получается:

Ок, теперь нам надо получить пересечение нашей крестовины и конуса.

Команда пересечения фигур: intersection()

Добавляем в наш код:

И получаем результат:

Стойка для крепления нити готова.

Дальше будет проще, рисуем ушко для нити.

Моделирование ушка для нити

Ушко — это будет маленькое колечко. Мы его создадим с помощью вычитания плоских цилиндров.

Для этого рисуем цилинд, высота которого будет равна толщине ушка, внутри него рисуем меньший цилиндр, и вычитаем из большего. Далее то что получилось поворачиваем на 90 градусов вокруг оси у, и поднимаем вверх на вершину нашей крестовины.

Вот этот фрагмент кода:

И результат

Вот это в коде нашей программы:

И вот результат:

То есть крепление для нити есть, теперь надо сделать основание для сд диска.

Основание для диска

Мы поступим хитро — мы не будем его рисовать. Мы воспользуемся Рафтом.

Что такое Рафт?

Рафт (raft) это техническая подложка, которую генерирует программа для 3д печати, это способ повышения прилипания печатаемой 3д фигурки.

Вот так выглядит Рафт, по сути это сеточка внизу:

Рафт автоматически вычисляется согласно контуру основания фигуры, и делается отступ вокруг, как правило 5мм.

Нам как раз это и надо — подложка, слой под нашей фигуркой обеспечит опору для CD-диска.

Кольцо в основании

Единственная тонкость — Рафт будет в форме крестовины, но это легко исправить — нарисуем тонкое кольцо внизу.

Рисуем два цилиндра, высотой 0.5 мм, внешний диаметром 14мм, то есть радиус 7 мм, внутренний радиусом 6.5 мм, и вычитаем — получим кольцо, поднимаем вверх на 0.25 (так как рисовали в центре координат).

Вот код фрагмента:

Результат:

И вот финальный код для рисования:

Системные переменные

Возможно отметили — что окружности получаются «угловатые», для увеличения количества сегментов для рисования окружностей, можно выставить параметр (в самом начале кода):

Тогда получится более красиво:

Генерация СТЛ

Теперь, не забываем нажать F6, для рендеринга. И в меню File -> Export -> Export as STL. , сохраняется STL файл.

Печать

Теперь загружаем полученный STL в программу 3д печати, не забываем выставить опцию Raft в настройках (5 мм).

Так это выглядит в программе Cura:

И стартуем на печать.

Результат

Вот деталька в действии:

В качестве заключения

Это конечно самые базовые возможности OpenSCAD (не были рассмотрены возможности создания своих функций, использование переменных), но даже их достаточно, чтобы относительно быстро сделать 3д модель.

Если вы не знаете где выполнить 3д печать в вашем городе, то можно сделать:

Подробный обзор программы OpenSCAD

OpenSCAD – это 3D-редактор, в котором удобно создавать несложные объекты в технических целях. Ниже мы расскажем, что представляет собой эта программа, какими возможностями, преимуществами и недостатками обладает, а также дадим пару уроков по основам проектирования объемных моделей и операций с ними.

Что такое OpenSCAD

OpenSCAD представляет собой скриптовый 3D-редактор параметрических моделей. Программа занимает крайне мало места на жестком диске, при этом обладает обширным функционалом, позволяющим создавать сложные и многогранные модели.

Чтобы начать создавать модели, нужно просто написать соответствующую команду в левой части окна. Так выглядит окно OpenSCAD на MacOS (на других системах заметных отличий нет).

Фото 1

Возможности OpenSCADа

Чтобы сделать, к примеру, самый простой геометрический примитив – куб – нужно просто написать команду cube(), а в скобках указать размер грани. При нажатии на F5 в правой части окна появится окошко визуализации с готовой фигурой, расположенной на осях координат в точном соответствии с указанным размером.

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

Без знаний сложных математических функций пользователю будет доступно создание скудного набора графических примитивов, таких как сферы, параллелепипеды, цилиндры и т. д. Набор операций тоже скромный – масштаб, трансляция, поворот и комбинирование при помощи булевых операций, создание тел вращения и вытяжения. Для того чтобы снять фаску с ребра фигуры, нужно искать специальные библиотеки, включающие соответствующие функции. То же самое с шестеренками и резьбой.

Ведь многое придется держать в уме: в программе отсутствует визуализация размеров, не отображается элемент в окне визуализации, код которого редактируется в данный момент. То есть необходимо запоминать, за какой элемент отвечает каждая часть кода.

Преимущества и недостатки

Программа имеет целый ряд плюсов, отметим самые основные:

  • Полностью бесплатная модель распространения. Любой желающий может загрузить утилиту с официального сайта и пользоваться. Также можно по желанию поддержать производителя, заплатив ему небольшую сумму на сайте.
  • Открытый исходный код.
  • Портативность: нет необходимости устанавливать программу. Можно загрузить ее на флеш-карту и запускать на любом удобном компьютере.
  • Интуитивно понятный интерфейс, которым легко научиться пользоваться. Сам язык проектировки также прост.
  • Не занимает много памяти на накопителе (всего 14 мегабайт).
  • Доступен не только на Windows (как 64, так и 32-битной версии), но также на MacOS и Linux.
  • При необходимости можно перенести свои проекты на другие CAD (Системы автоматизированного проектирования), так как код, написанный в OpenSCAD, будет легко распознаваться большинством из них.
  • В ходе работы с программой можно усвоить азы программирования, после чего переключиться на другие CAD – более сложные, но и обладающие большим диапазоном возможностей. Некоторые из САПР также имеют поддержку параметрических систем проектирования.
  • Проект можно сохранить в различных форматах: STL, OFF, AMF, DXF, SVG, CSG.

Модель можно создать в OpenScad, прописав несколько незамысловатых команд. К примеру, чтобы создать квадрат в середине экрана со стороной 100 мм, достаточно написать следующее: «cube (100, true)». Отдельно стоит перечислить главные преимущества кода, с которым предстоит работать в программе:

  • Простая и железная логика поведения объекта. Возможность точно назначать размеры фигур.
  • Возможность делать проекты с помощью блоков, которые потенциально могут использоваться неоднократно. Здесь можно провести параллель с объектно-ориентированным программированием.
  • Возможность задавать размеры с помощью параметров – замена одного числа меняет фигуру целиком, нет необходимости переписывать размеры и расположение каждой грани.
  • Поддерживается использование математических функций, условий и циклов, возможность контроля версий и подключения сторонних библиотек.

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

В пособии представлена практическая реализация П-, ПД- и ПИД-регуляторов для смоделированного, собранного и запрограммированного на языке C++ робота.

Но программа OpenSCAD не лишена и минусов. Самые значительные из них:

  • При создании моделей используются примитивы. Это значительно упрощает проектирование, но в то же время многие возможности становятся недоступны при таком способе моделирования.
  • Легко убрать фаску с грани не получится. Для обеспечения плавности фигур нужно тратить много времени. Во многих других CAD это делается одним кликом курсора.
  • Язык OpenSCAD неполноценен, также он является недостаточно низкоуровневым.
  • Плохо подходит для работы со скульптурой или анимацией. Для этих целей лучше пользоваться Blender.
  • Если вы только начинаете использовать программу и знаете мало команд, то вам будет удобнее пользоваться специальными иконками с определенными действиями в интерактивной оболочке. К сожалению, интерфейс OpenSCAD довольно беден, и функций в нем предоставлено недостаточно.
  • Программа тормозит при обработке и рендере сложных моделей. Особенно, если модель имеет большое количество граней.
  • OpenSCAD редко обновляется. Если обновление все же появилось, то оно вряд ли что-то значительно поменяет. Последнее на данный момент обновление датируется маем 2019 года.
  • Отсутствует поддержка сплайнов и NURBS.

Уроки для начинающих по OpenSCAD

Ниже мы рассмотрим, что нужно знать и уметь начинающему программисту в OpenSCAD.

Настройка программы

Настройка программы не вызывает никаких трудностей, достаточно выбрать нужную версию и скачать с официального сайта. Есть 64-битная и 32-битная версии. При необходимости можно выбрать портативную версию, не требующую установки на компьютер (например, если нужно закачать ее на флешку и работать со своими проектами на других ПК).

Основы

Для начала рассмотрим, как создавать простейшие геометрические фигуры, а затем расскажем, какие основные операции к ним можно применять.

Сфера создается следующей командой: «sphere(r=x, $fn=y)», где r – радиус, а $fn – разрешение. Наглядно разницу в разрешении вы можете увидеть на примерах ниже.

Фото 2

У наиболее гладкой фигуры (которая больше всего похожа на шар) разрешение равно 100, время у фигуры в левом нижнем углу – 4 при радиусе 8. Также в функции sphere можно задавать и другие параметры (вместо радиуса – диаметр d, вместо разрешения – угловое разрешение $fa или размер грани в мм $fs). Центр сферы всегда по умолчанию располагается в начале координат.

Параллелепипед создается функцией «cube(size=[x,y,z], center=true )», где x, y, z – длины сторон по соответствующим осям. Значение center можно заменить на false (это его значение по умолчанию), чтобы расположить фигуру в положительных значениях осей, а не строго по центру. Так выглядит параллелепипед, вызванный командой «cube([10, 20, 30], true );» (как видите, это сокращенный вариант записи, т. е. ключевые аргументы прописывать необязательно).

Фото 3

Чтобы вызвать куб, достаточно указать только одно число, ему будут равны длины граней во всех плоскостях (например, при команде cube(5) появится куб со стороной 5 мм, левый нижний задний угол которого находится в начале координат).

Пирамиду, цилиндр, а также их усеченные варианты создаются при помощи функции cylinder. В общем виде функция выглядит следующим образом: «cylinder(h=a, r1=b, r2=c, center=true, $fn=d);», где h – высота цилиндра, r1 – радиус снизу, r2 – радиус сверху, $fn – число граней. Ключевые аргументы писать также необязательно при вызове команды, краткий вариант записи — «cylinder(a, b, c, center=true, d);».

Вместо r1 и r2 можно указывать диаметры d1 и d2. Если нужен цилиндр, достаточно указать один радиус r.

Фото 4

Многогранник задается через функцию polyhedron. Пример кода в OpenScad:

polyhedron(
points=[ [10,10,0], [10,-10,0], [-10,-10,0], [-10,10,0], [0,0,10] ],
faces=[ [0,1,4], [1,2,4], [2,3,4], [3,0,4], [1,0,3], [2,1,3] ]
);

Функция сложная в использовании, а потому применяется редко. В параметре points указываются координаты всех вершин фигуры, а в faces – грани, в которых перечислены индексы элементов в points. То есть грани создаются за счет соединения точек, чьи координаты указаны.

В данном случае мы имеем дело с пирамидой, основание которой находится в плоскости Z = 0 по центру, а вершина располагается на высоте 10 мм. Основание создается за счет двух треугольных граней, поэтому в параметре faces перечислено 6 элементов.

Фото 5

Как кодировать в OpenScad

Функционал программы позволяет совершать операции с фигурами.

Чтобы переместить объект, нужно применить функцию «translate ([x, y, z])», где x, y, z – расстояние по соответствующим осям, на которое фигуру нужно передвинуть. Сначала мы меняем первоначальное положение, а потом создаем в нем фигуру:

translate([10,10,0]) cube(10, true);

То есть центр куба со стороной 10 мм будет располагаться в координатах x = 10, y = 10, z = 0.

Фото 6

Если нужно передвинуть несколько объектов, их нужно перечислить в фигурных скобках:

Переносы могут быть вложенными, если вы хотите переместить набор моделей в одну точку, а затем одну из них передвинуть относительно этой точки:

translate([x1,y1,z1]) <
cube(10, true);
translate([x2,y2,z2]) sphere(5, $fn=50);
>;

Таких вложенных переносов может быть много.

Модели можно вращать на заданное количество градусов при помощи функции rotate, указанной перед другой функцией, создающей фигуру: «rotate([x, y, z]) cube(5, true);», где x, y, z – градусы по осям. Пример кода:

Rotate([90, 0, 0]) cube(5, true);

В данном случае мы вращаем куб на 90 градусов по оси x. Как и в случае с функцией translate, можно делать операцию над группой объектов, заключенных в фигурные скобки:

Сочетаем обе функции:

  1. color([0,1,1]) translate([0,0,15]) rotate([75,0,0]) cube(10, true);
  2. color([1,0,1]) rotate([75,0,0]) translate([0,0,15]) cube(10, true);

Фото 7

Учитывайте, что порядок функций имеет значение. Бирюзовая фигура была сначала повернута, затем перемещена, сиреневая – наоборот. Цифры, указанные в функциях, одинаковые.

Функция, позволяющая складывать (объединять) объекты: «union()<>», в фигурных скобках указываются объекты.

Пример кода:

union() <
cylinder(30, 6, 6, true, $fn=60);
rotate([60,0,0]) cylinder(30, 6, 6, true, $fn=60);
>;

Фото 8

В данном случае мы объединяем 2 цилиндра, один из которых повернут на 60 градусов. Количество объектов в фигурных скобках не ограничено.

Функция разности – difference()<> — позволяет вычитать один объект из другого. В фигурных скобках первой указывается фигура, из которой будут вычитаться последующие.

Пример кода:

difference() <
cylinder(30, 6, 6, true, $fn=60);
rotate([60,0,0]) cylinder(30, 6, 6, true, $fn=60);
>;

Фото 9

Фигуры с теми же параметры, что и в примере со сложением.

Функция intersection()<> оставляет только общую область, в которой перечисленные в фигурных скобках объекты пересекаются.

Пример кода:

intersection() <
cylinder(30, 6, 6, true, $fn=60);
rotate([60,0,0]) cylinder(30, 6, 6, true, $fn=60);
>;

Модификатор # используется, если вы хотите, чтобы объект, участвовавший в пересечении, сложении или вычитании, был виден целиком. Это бывает полезно при отладке.

Пример кода:

translate([10,0,0]) difference() <
cylinder(30, 6, 6, true, $fn=60);
rotate([60,0,0]) #cylinder(30, 6, 6, true, $fn=60);
>;

translate([-10,0,0]) intersection() <
#cylinder(30, 6, 6, true, $fn=60);
rotate([60,0,0]) cylinder(30, 6, 6, true, $fn=60);
>;

Фото 10

В первом случае мы видим вторую фигуру, вычитаемую из первой, которая стала прозрачной. Во втором случае отображен первый цилиндр, участвовавший в операции пересечения.

Модификатор * прописывается перед участком кода программы, который пользователь не хочет выводить в окно просмотра в данный момент. При этом не требуется удалять код. * — аналог # на некоторых языках программирования, которым можно научиться тут: https://itvdn.com/ru.

Модификатор ! выделяет элемент, перед которым он указывается. При этом остальной код не отображается в окне просмотра.

Модификатор % убирает элемент из кода, но модель показывается прозрачным серым цветом.

Фигуры можно сжимать посредством функции «scale([kx, ky, kz])», где kx, ky, kz – коэффициенты растяжения (или, при значении меньше 1, – сжатия) по соответствующим осям.

Пример кода:

scale([2,2,0.5]) sphere(9, $fn=25);

Фото 11

В данном случае мы растягиваем сферу в 2 раза в плоскости xy и сжимаем ее по z вдвое.

Чтобы задавать цвет модели, нужно использовать команду color(x, y), где x – цвет в виде строки («red», «green», «black», «yellow», «lime», «wheat», вплоть до составных, вроде «lightgoldenrodyellow».) или в формате [R, G, B] (R – доля красного, G – доля зеленого, B – доля синего), а y – прозрачность (0 – невидимый, 1 – совсем непрозрачный). Прозрачность в OpenSCAD иногда отображается некорректно.

Обычно доли цветов задаются от 0 до 255, но в случае с OpenSCAD нужно указывать цифру от 0 до 1. К примеру, синий цвет задается как [0, 0, 1]. Полный список цветов в текстовом формате:

Фото 12

Функция text позволяет создать двумерную модель написанного текста. Поддерживается как латиница, так и кириллица. Шрифты берутся из вашей системы, т. е., если вы хотите нестандартный шрифт, то нужно загрузить его и установить в Windows, затем пользоваться им в самой программе. В программе OpenSCAD есть справка по шрифтам, где описано, какой из шрифтов какие стили поддерживает – жирный, курсив и т. д.

Пример кода:

text(text=»\u00A9 Наш Колхоз»,
language=»ru»,
font=»Segoe Script:style=Bold»,
$fn=30);

Фото 13

В параметре language задается язык написанного (по умолчанию параметр равен «en») в параметре font указывается шрифт, после двоеточия в style можно указать курсив («Italic») или жирный («Bold»), при условии, что эти стили поддерживаются данным шрифтом.

С помощью всех перечисленных функций уже можно создавать сложные фигуры.

Фото 14

Как экспортировать дизайн из OpenScad в STL

В интерфейсе программы нужно перейти по пути Файл – Экспорт, затем выбрать пункт «Экспорт как STL», чтобы экспортировать проект, если его нужно открыть в другом редакторе.

Все дело в том, что OpenSCAD сохраняет проект в текстовом формате, а не в двоичном. Чтобы преобразовать файл в двоичный формат, можно воспользоваться утилитой MeshLab, которая совершенно бесплатна.

Для начинающего программиста будет довольно тяжело работать с этой программой и создавать сложные фигуры, так как нужен опыт работы с кодом. Но в то же время для опытного программиста OpenSCAD дает огромный диапазон возможностей благодаря подключению сторонних библиотек и высокой скорости работы, а также функции импорта. Ею можно воспользоваться, чтобы продолжить работать с проектом в другом редакторе, если функционала OpenSCAD перестанет хватать.

Распечатать форму сердца со словами внутри

Примерно так же, как и другой ответ, но я уже начал, поэтому я подумал, что я могу закончить. В качестве бонуса вы можете указать, на какой линии фигуры «V» она печатается.

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

Вы можете просто подождать, пока не доберетесь до заранее определенной позиции в сердце и распечатать сообщение вместо «V», например так:

y += strlen(message)-1; является продвижение индекса столбца в соответствии с количеством напечатанных символов. (2*size — strlen(message)/2) позиция, которая будет центрировать строку

Если вы хотите запутать код как можно больше (поэтому вы не знаете, что это за сообщение, пока код не запустится), вы можете использовать хеш-таблицу для отображения позиций на буквы или что-то в этом роде.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *