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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2016, 13:48   #1
Fairq
 
Регистрация: 19.12.2016
Сообщений: 8
По умолчанию Построить букву N в 3D (GraphABC)

Здравствуйте,нужно построить объемную букву N,которая будет меняться от масштаба (h-высота,w-ширина,l-длинна)
Проблема заключается в построении видимых-невидимых линий(линии,которые будет видно в только от масштаба). Если линию не видно,она должна быть пунктирной. Вот буква без видимых-невидимых линий:
Код:
uses GraphABC;
var h,w,l,d,b,c,v: integer;
    P:array of point;
begin
d:=150;        
b:=300;        
{write('Введите высоту буквы N:  h='); read(h); writeln(h);
write('Введите ширину буквы N:  w='); read(w); writeln(w);
write('Введите длину буквы N:  l='); read(l); writeln(l);}
 h:=200;w:=200;l:=200;

c:=round(sqrt(2)*l/6);    //x
v:=round(sqrt(2)*h/6);    //y

//видимые линии N

SetPenWidth(2);
SetLength(P,10);               //N 2D
P[0].X:=d;                     P[0].Y:=b;
P[1].X:=d ;                    P[1].Y:=b-h;
P[2].X:=d+round(w/3) ;         P[2].Y:=b-h;
P[3].X:=d+2*round(w/3) ;       P[3].Y:=b-round(h/2);
P[4].X:=d+2*round(w/3) ;       P[4].Y:=b-h;
P[5].X:=d+w ;                  P[5].Y:=b-h;
P[6].X:=d+w ;                  P[6].Y:=b;
P[7].X:=d+2*round(w/3) ;       P[7].Y:=b;
P[8].X:=d+round(w/3) ;         P[8].Y:=b-round(h/2);
P[9].X:= d+round(w/3);         P[9].Y:=b;
Polygon(P);


SetLength(P,4);                //N 3D
P[0].X:=d;                     P[0].Y:=b-h;
P[1].X:=d+c;                   P[1].Y:=b-h-v;
P[2].X:=d+round(w/3)+c;        P[2].Y:=b-h-v;
P[3].X:=d+round(w/3);          P[3].Y:=b-h;
Polygon(P);
  SetLength(P,4);
  P[0].X:=d+2*round(w/3);                     P[0].Y:=b-h;
  P[1].X:=d+2*round(w/3)+c;                   P[1].Y:=b-h-v;
  P[2].X:=d+w+c;                              P[2].Y:=b-h-v;
  P[3].X:=d+w;                                P[3].Y:=b-h;
  Polygon(P);
SetLength(P,4);
P[0].X:=d+w;              P[0].Y:=b;
P[1].X:=d+w+c;                P[1].Y:=b-v;
P[2].X:=d+w+c;        P[2].Y:=b-h-v;
P[3].X:=d+w;               P[3].Y:=b-h;
Polygon(P);  

//всегда невидимые линии
SetPenStyle(psDash);SetPenWidth(2);
line(d,b,d+c,b-v);
line(d+c,b-v,d+c,b-h-v);
line(d+c,b-v,d+round(w/3),b-v);   
line(d+2*round(w/3),b,d+2*round(w/3)+c,b-v);
line(d+2*round(w/3)+c,b-v,d+w+c,b-v);
line(d+2*round(w/3)+c,b-v,d+2*round(w/3)+c,b-h-v);

end.
Fairq вне форума Ответить с цитированием
Старый 19.12.2016, 13:50   #2
Fairq
 
Регистрация: 19.12.2016
Сообщений: 8
По умолчанию

Fairq вне форума Ответить с цитированием
Старый 19.12.2016, 19:19   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,792
По умолчанию

а ничё больше в нарисованной букве N не забыл? ещё двух наклонных линий не хватает. и уголка снизу слева
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 19.12.2016, 19:25   #4
Fairq
 
Регистрация: 19.12.2016
Сообщений: 8
По умолчанию

Эти линии не всегда будут видны,т.к. масштаб меняет сам пользователь. Требуется написать условие,чтобы линии отображались корректно(если линию перекрывает какая-то часть буквы,то она должна продолжаться пунктиром)

Последний раз редактировалось Fairq; 19.12.2016 в 19:32.
Fairq вне форума Ответить с цитированием
Старый 20.12.2016, 10:09   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Эти линии не всегда будут видны,т.к. масштаб меняет сам пользователь.
Среди этих (вновь добавленных) только одна будет "частично" видимой прочие всегда невидимы. Потому что пропущена еще одна видимая (и тоже частично).
Хотя нет есть еще одна которая будет изредка чуть-чуть видима.

0. вводим(задаем) исходные данные.
1. расчет координат переднего плана.
(мы уже можем что-то нарисовать) ВЕСЬ первый план есть видимые линии.
2. расчет координат второго плана (можно просто как смещение вправо-вниз)
и опять кое-что можно нарисовать. Большая часть второго плана есть всегда невидимые, хотя встречаются и всегда видимые.
К тому же есть линии "глубины", соединяющие соответствующие точки первого и второго плана. они тоже будут как всегда видимые, так и всегда невидимые.

итак остались непонятные линии, то они видны, то нет.
3. расчет точек изменения видимости.
Цитата:
Требуется написать условие,
любая точка "смены" видимости есть пересечение ДВУХ отрезков.
ДВА уравнения НЕпараралельных прямых проходящих через ДВЕ точки каждая.
система из двух уравнений с двумя переменными имеет единственное решение = точка их пересечения.
добавляем ограничения на принадлежность решения (данной точки) ДВУМ отрезкам
получаем
a) ЕСТЬ решение и это ЕСТЬ точка "смены" видимости.
б) НЕТ решения (точка пересечения ВНЕ наших отрезков) и НЕТ точки смены видимости.

http://www.programmersforum.ru/showt...F0%FF%EC%FB%F5
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.12.2016 в 10:52.
evg_m вне форума Ответить с цитированием
Старый 20.12.2016, 12:08   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

простите, а разве не так буковка должна выглядеть?
risunok_N(3d).gif
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.12.2016, 15:13   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,876
По умолчанию

Serge, забыл пунктирку между зубчиками внизу.
И изначально на рисунке линия вертикальная третья по счёту справа должна идти сверху только до середины.
phomm вне форума Ответить с цитированием
Старый 22.12.2016, 15:29   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Serge, забыл пунктирку между зубчиками внизу.
И изначально на рисунке линия вертикальная третья по счёту справа должна идти сверху только до середины.
согласен.

это примерно так:
risunok_N(3d).gif
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.12.2016, 17:59   #9
Fairq
 
Регистрация: 19.12.2016
Сообщений: 8
По умолчанию

Никак не могу найти точку пересечения прямых AB и CD
координаты точек:
A(d+w/3 +c;b-v-h) B(d+2*w/3 +c;b-h/2-v) C(d+2*w/3 +c;b-h) D(d+2*w/3 +c;b-h-v
остальные линии получились,а здесь система у меня никак не решается
Fairq вне форума Ответить с цитированием
Старый 23.12.2016, 18:36   #10
Fairq
 
Регистрация: 19.12.2016
Сообщений: 8
По умолчанию

y=-(vx/c)+b-h+dv/c +(2vw)/(3c)
y=(3hx)/(2w) -((-2bw+3ch+3dh+3hw+2wv)/(2w))
вот система,Вольфрам не справляется
Fairq вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенести последнюю букву в начало слова; удалить из слова первую букву Narsky Помощь студентам 68 03.07.2016 18:54
В произвольном тексте найти и отпечатать слова, содержащие букву i, но не содержащие букву m Zeitgesterz Общие вопросы C/C++ 3 09.12.2014 20:52
GraphABC LittleG Паскаль, Turbo Pascal, PascalABC.NET 19 26.09.2014 12:00
Pascal ABC. В текстовом русскоязычном файле убрать все слова, начинающиеся на букву «а» и одновременно содержащие букву «о» MarsLoveMoon Паскаль, Turbo Pascal, PascalABC.NET 8 25.04.2014 17:03
Разработать две подпрограммы: букву в заглавную и букву в строчную (в т.ч. для русского языка) makzagdon Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 25.04.2011 08:53