Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2023, 18:41   #1
Leonskyy
Новичок
Джуниор
 
Регистрация: 01.11.2023
Сообщений: 3
По умолчанию 3D ASCII аrt фигуры Python

Привет всем!
Я новичок в пайтоне, но мне дали задание, которое я совсем не понимаю как выполнить
Необходимо нарисовать 3D ascii art фигуры(куба, например) в консоли, при этом чтобы по желанию пользователь мог превратить ее в 2D. Также, чтобы он мог задавать размеры и цвета фигуры. У меня были наработки, но они все были неудачными. Есть идея сделать это через трехмерную матрицу, но я не знаю как это сделать, чтобы фигура выглядела правильно и действительно 3D. Помогите пожалуйста понять или показать способ реализации задачи, буду очень признателен!
Leonskyy вне форума Ответить с цитированием
Старый 01.11.2023, 19:43   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Код:
  +----+
 /    /|
+----+ |
|    | +
|    |/
+----+
А в чем проблема? Зачем матрица?
p51x вне форума Ответить с цитированием
Старый 01.11.2023, 20:21   #3
Leonskyy
Новичок
Джуниор
 
Регистрация: 01.11.2023
Сообщений: 3
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
  +----+
 /    /|
+----+ |
|    | +
|    |/
+----+
А в чем проблема? Зачем матрица?
Мне надо как-то вывести этот куб. Одно из условий задания: Определите структуры данных в пределах класса для представления 3D-фигуры. Это может включать использование списков, матриц или других структур данных для хранения формы фигуры и ее свойств.
И еще одно условие: Реализуйте метод, который преобразует 3D-представление фигуры в 2D-представление, пригодное для ASCII-арта.
Как человек объяснил, можно сделать через матрицу, чтобы при выводе 2D фигуры использовалась одна матрица с передней стороной, а не все. Честно, я не знаю как это представляет человек который задал задание, он слабо объяснил, но хоть что-то...
Leonskyy вне форума Ответить с цитированием
Старый 02.11.2023, 01:35   #4
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

Учтите количество пробелов в фигуре 3D
применяя простейший принцип
до сих пор в теме не прозвучавший

Код:
*****X=====X
****/*****/|
***/*****/*|
**/*****/**|
*/*****/***X
X=====X***/
|*****|**/
|*****|*/
|*****|/
X=====X
Ответ на вопрос ниже: это балка "чтобы он мог задавать размеры и цвета фигуры"

Если автору нужен принцип перевода чтоб получилась диметрия
тогда важно читать мои темы



да там всё на языках высочайшего уровня qb64 & C#

p.s. применяется массив
p.p.s. то бишь искомая автором матрица
p.p.p.s. но пока рисуйте ASCII параллелограмм
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 02.11.2023 в 11:24.
сфинкс вне форума Ответить с цитированием
Старый 02.11.2023, 08:02   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

сфинкс, ну что, учли? Почему у вас куб превратился в это?
p51x вне форума Ответить с цитированием
Старый 04.11.2023, 00:52   #6
Leonskyy
Новичок
Джуниор
 
Регистрация: 01.11.2023
Сообщений: 3
По умолчанию

Цитата:
Сообщение от сфинкс Посмотреть сообщение
Учтите количество пробелов в фигуре 3D
применяя простейший принцип
до сих пор в теме не прозвучавший

Код:
*****X=====X
****/*****/|
***/*****/*|
**/*****/**|
*/*****/***X
X=====X***/
|*****|**/
|*****|*/
|*****|/
X=====X
Ответ на вопрос ниже: это балка "чтобы он мог задавать размеры и цвета фигуры"

Если автору нужен принцип перевода чтоб получилась диметрия
тогда важно читать мои темы



да там всё на языках высочайшего уровня qb64 & C#

p.s. применяется массив
p.p.s. то бишь искомая автором матрица
p.p.p.s. но пока рисуйте ASCII параллелограмм
Так выглядит результат, который мне нужен, но проблема в том, что я как раз таки понятия не имею как реализовать. Через какой метод, массивы и прочее. Можно подсказку?
Leonskyy вне форума Ответить с цитированием
Старый 04.11.2023, 10:09   #7
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

впервые в теме пишу ответ: цикл

пробелов количество: цикл
и длина горизонтали количество: цикл

и в результате вложенные циклы

вариант балки длиннее показательнее

Код:
********X=====X 1
*******/*****/| 2
******/*****/*| 2
*****/*****/**| 2
****/*****/***X 3
***/*****/***/  4
**/*****/***/   4
*/*****/***/    4
X=====X***/     5
|*****|**/      6
|*****|*/       6
|*****|/        6
X=====X         7
напишите как рисуется на человеческом языке

программа ниже онлайн работает если ввели данные счастливые

https://rextester.com/HPZ41539

https://jdoodle.com/ia/PXs и жмите Execute
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 05.11.2023 в 09:37.
сфинкс вне форума Ответить с цитированием
Старый 04.11.2023, 12:47   #8
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Решил попробовать, но натолкнулся на детали, в которых не стал рыться
Хотелось построить изображение параллелепипеда с размерами a*b*c.
1. Из черчения известно, что для отображения глубины надо рисовать этот размер под углом 30 град и в два раза меньшим.
2. Для визуального восприятия прямоугольника как квадрата надо соблюсти отношение сторон как 3:4.
Дополнительно надо учесть соотношение между размером знакоместа и расстоянием между строками.

Следующий код рисует параллелепипед, но только полным подбором параметров ручками. И тут не учитываются масштабирующие коэффициенты:
Код:
a = 5
b = 7
c = 9
ssp = ' '
ss = '/'
sp = '+'
sm = '-'
st = '|'
print(f'{ssp*(c - 2):}{sp:}{sm*a}{sp}')
for i in range(c-3,-1, -1):
    print(f"{ssp*i:}{ss:}{ssp*a:}{ss:}{ssp*(c-3-i):}{st:}")
    b -= 1
    if b == 2:
        print(f"{ssp*(c-8):}{ss:}{ssp*a:}{ss:}{ssp*5}{sp:}")
        break
print(f'{sp:}{sm*a:}{sp:}{ssp*(c-4):}{ss:}')
for i in range(b+2):
    print(f"{st:}{ssp*a:}{st:}{ssp*(c-5-i):}{ss:}")
print(f'{sp:}{sm*a:}{sp:}')
Получается такой прямоугольник:
Код:
       +-----+
      /     /|
     /     / |
    /     /  |
   /     /   |
  /     /    |
 /     /     +
+-----+     /
|     |    /
|     |   /
|     |  /
|     | /
+-----+
Возможно TC доделает?
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 05.11.2023, 18:34   #9
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

Копируя заднюю плоскость смещайте

по диагонали из сверху справа налево вниз
в цикле и там видимо 5 слоёв плоскостей

и возможно смещение направо вниз

Код:
'12345678x12345x KUBIK.bas
'........x=====x 1
'......./-----/| 2
'....../-----/|| 2
'...../-----/||| 2
'..../-----/|||X 3
'.../-----/|||/ 4
'../-----/|||/ 4
'./-----/|||/ 4
'x=====x|||/ 4
'|*****|||/ 4
'|*****||/ 4
'|*****|/ 4
'x=====x 5
a = 5: b = 5: c = 5: Locate 1, 1
For i = 1 To c: Print ".";: Next
Print "x";: For i = 1 To a - 2: Print "=";: Next: Print "x 1"

For i = 1 To b - 2:
    For j = 1 To a + c - 2: Print ".";: Next: Print "|| 2"
Next

For i = 1 To a + c - 2: Print ".";: Next: Print "|X 3"

For i = 1 To c - 1: Locate i + 1, 1
    For j = c - i To 1 Step -1: Print ".";: Next: Print "/";
    For k = 1 To a - 2: Print "-";: Next: Print "/"

    For m = 1 To b - 2
        For n = 1 To c + a - 1 - i: Print "|";: Next: Print
    Next

    For p = 1 To a + c - 1 - i: Print "|";: Next: Print "/ 4"
Next

Locate i + 1, 1: Print "x";: For i = 1 To a - 2: Print "=";: Next: Print "X"
For i = 1 To b - 2: Print "|";
    For j = 1 To a - 2: Print "-";: Next: Print "|"
Next

Print "x";: For i = 1 To a - 2: Print "=";: Next: Print "X 5"
Очевидно применена команда Locate языка высочайшего уровня qbasic qb64
что возможно проблематично на искомом языке
зато подобие Locate есть в си-образных языках
например в похожем на qbasic qb64 C#
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 05.11.2023 в 19:28.
сфинкс вне форума Ответить с цитированием
Старый 07.11.2023, 08:30   #10
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 957
По умолчанию

Пока никто новые задачи не задаёт
данная тема возможно решаема на python
заполнив массив символами как у меня на qbasic qb64
и выведя массив на экран

Мой алгоритм работает онлайн в эмуляторе qb64 на js

https://qbjs.org/?mode=auto&src=http...t.php?aid=2387
qbjs.org/?mode=auto&src=https://qb64phoenix.com/forum/attachment.php?aid=2387

и планирую создать ссылки на некоторые мои визуальные программы

Спросив на форуме qb64 создали несколько вариантов
да я ещё не проверял

Картинка 36 КБ



Чтоб закончить: программа без Locate

Код:
_Title "Kube11.bas"
Randomize Timer ' kube.bas  'bplus 2023-11-05
Do
    Cls
    a = Int(Rnd*13)+3: b = Int(Rnd*7)+3: c = Int(Rnd*10)+3
    If c < b Then c = b ' a = 7: b = 5: c = 8 ' test OK
    d = b+c: w = a-2: h = b-2: rw = 0
    For i = 1 To d
        If i > c Then
            If rw > d-i Then rw = d-i
        End If
        If i = 1 Then ' case 1
            Print String$(c-i+1,".")+"T"+String$(w,"=")+"T 1"; Tab(40); i
        ElseIf i < b Then ' case 2
            Print String$(c-i+1,".")+"/"+String$(w,"-")+"/"+String$(rw,"|")+" 2"; Tab(40); i
        ElseIf i = b Then ' case 3
            Print String$(c-i+1,".")+"/"+String$(w,"-")+"/"+String$(rw,"|")+"J 3"; Tab(40); i
        ElseIf i <= c Then
            Print String$(c-i+1,".")+"/"+String$(w,"-")+"/"+String$(rw,"|")+"/"+" 4"; Tab(40); i
        ElseIf i = c+1 Then ' T bar
            Print "T"+String$(a-2,"=")+"T"+String$(rw,"|")+"/ 4"; Tab(40); i
        ElseIf i > c+1 And i <> d Then
            Print "|"+String$(a-2,"*")+String$(rw,"|")+"/ 4"; Tab(40); i
        ElseIf i = d Then
            rw = 0
            Print "L"+String$(a-2,"=")+"J 5"; Tab(40); i
        End If
        rw = rw+1
        If rw > h Then rw = h
        If d-i+1 < rw And i > c Then rw = d-i
    Next
    Print: Print " a"," b"," c": Print a,b,c: _Delay 1
Loop
Показывает сменяющиеся параллелепипеды вида
Код:
'........T=====T 1
'......./-----/| 2
'....../-----/|| 2
'...../-----/||| 2
'..../-----/|||J 3
'.../-----/|||/ 4
'../-----/|||/ 4
'./-----/|||/ 4
'T=====T|||/ 4
'|*****|||/ 4
'|*****||/ 4
'|*****|/ 4
'L=====J 5
Визуальная программа онлайн по ссылке:

https://qbjs.org/?mode=auto&src=http...t.php?aid=2390
qbjs.org/?mode=auto&src=https://qb64phoenix.com/forum/attachment.php?aid=2390
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 07.11.2023 в 13:24.
сфинкс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Python - как установить Easy-Machine-Learning-Object-Detection при уже установленном Python 3.9 Krasi Общие вопросы по программированию, компьютерный форум 4 23.12.2021 15:49
Код, вычисляющей длину линии вертикального разреза фигуры, значения площадей фигуры слева и справа от линии разреза, по значениям аргумента, введенного с консоли nertex Помощь студентам 21 22.09.2019 12:13
[Python] Нужно решить в среду вечером 5 -6 заданий для начинающих на языку Python. Пример заданий смогу выслать. Задания на английском языке. foxylen Фриланс 2 17.03.2019 12:30
Начальный уровень Python. Функции - Python YYYUUU Python 5 09.06.2017 12:09
Движение одной фигуры,вслед изменения высоты другой фигуры. 7vlad37 Microsoft Office Excel 3 21.07.2011 18:01