1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Сейчас стараюсь решить задачку в графике, однако возникло масса проблем с кодингом. Условие следующее:
Я представил эту ситуацию так: Каждая сторона имеет свой номер(чтобы было проще соориентироваться, при отрисовке линий). Проблемы которые возникли: 1) Отрисовка этих линий в одном треугольнике (начинаем с треугольника FOA) 2) "Отзеркаливание" этих линий, вместо того, чтобы рисовать их с нуля. (в нашем примере, нарисовав линии в треугольнике FOA, рисуем зеркально линии в OAB, относительно OA; после этого, опять зеркально рисуем для треугольника BOC, относительно BO).
Для отрисовки линий, пока трудно представляю как выбрать некоторые "случайные" координаты для первой точки линии на одной стороне, а после, взять другие "случайные" на одной из двух других. Пока что пришло на ум, через case как-то выделять эти стороны, обращение к ним, если одна из них выбрана. С отзеркаливанием линий, это по-мойму самая сложная часть, поскольку возникают вопросы: а) как указать программе, какую взяли линии за "ось симметрии" б) рисовать относительно нее линии
Исходный код, того, чего я смог пока сделать(Показать/Скрыть)
Uses Crt, Dos, Graph;
Type CoordsXY=array [1..7] of PointType; {Массив для хранения координат вершин шестиугольника} CoordsTr=array [1..3] of PointType; {Массив для хранения координат вершин треугольника}
Var center: PointType; {Центр шестиугольника} top : CoordsXY; {Координаты вершин шестиугольника} tr : CoordsTr; {Координаты вершин треугольника} i : integer; {Счетчик для циклов} R : integer; {Радиус} LineN : integer; {Количество линий, отрисованных в КАЖДОМ треугольнике} N : integer; {Максимальное количество случайный линий в треугольнике} x1,y1 : real; {Координаты начальной точки линии} x2,y2 : real; {Координаты конечной точки линии}
{Инициализация графики} Procedure Init; var Driver, Mode, ErrorCode: smallint; begin Driver:=detect; InitGraph(Driver,Mode,''); ErrorCode:=GraphResult; if ErrorCode<>grOK then begin Writeln(GraphErrorMsg(ErrorCode)); Halt(1); end; end;
{Ввод с клавиатуры ряда параметров} Procedure EnterParametrs; Begin clrscr; write('Введите радиус: '); readln®; writeln; write('Максимальное кол-во линий в треугольнике: '); readln(N); End;
{Отрисовка шестиугольника} Procedure DrawHexagon; Begin {Сначала найдем центр рабочей области} center.X:=GetMaxX div 2; center.Y:=GetMaxY div 2; {Потом определяем вершины шестиугольника} for i:=1 to 6 do begin top[i].X:=center.X+trunc(R*cos(((60*pred(i)+90)mod 360)*pi/180)); top[i].Y:=center.Y-trunc(R*sin(((60*pred(i)+90)mod 360)*pi/180)); end; top[7]:=top[1]; {Рисуем сам шестиугольник} setcolor(random(14)+1); for i:=1 to 6 do begin {вершина треугольника(центр шестиугольника)} tr[1]:=center; {вторая вершина} tr[2]:=top[i]; {третья вершина} tr[3]:=top[i+1]; {заливка треугольников цветом и их отрисовка} setfillstyle(solidfill,random(14)+1); fillpoly(3,tr); end; End;
{Поиск начальной координаты линии} Procedure FindXYStart(a,b:real); Begin End;
{Поиск конечной координаты линии} Procedure FindXYEnd(a,b:real); Begin end;
{Отрисовка N линий в треугольнике} Procedure DrawLines; Begin LineN:=random(N)+1; for i:=1 to lineN do begin x1:=0; y1:=0; x2:=0; y2:=0; FindXY(x1,y1); FindXY(x2,y2); SetColor(Blink); Line(x1,y1,x2,y2); end; End;
Begin {Вводим параметры с клавиатуры} EnterParametrs; {Запускаем графический режим и работаем с ним} Init; DrawHexagon; DrawLines; {После работы графического режима, отключаем его} readkey; CloseGraph; End.
1. Я не работал бы в декартовой системе координат. Гораздо проще сделать это всё в полярной. Представь себе, что у тебя каждый треугольник - это два угла (отклонения от нулевого угла ПСК двух сторон, которые радиусы), и дистанция от центра (для того, чтоб знать, какой длины радиусы, собственно). То есть, по этим трем числам ты однозначно рисуешь любой треугольник.
2. Разбиение треугольника линиями. Развиваем мысль относительно ПСК, каждая линия - это еще одна дистанция (если конец отрезка лежит на радиальной стороне) или еще один радиус + дистанция (если не на радиальной). Генерируешь случайным образом несколько пар чисел, и по ним рисуешь линии.
3. А теперь - самое интересное: как зеркально отразить линии от какой-то оси? А просто... С одной стороны (общая радиальная сторона двух треугольников) вообще ничего делать не надо правда? А для точек, лежащих на другой стороне, что надо сделать? Изменить угол (если у тебя 6-ти угольник, то каждый центральный угол = 360/6 = 60 градусов, то есть, тебе достаточно уменьшить/увеличить угол на 120 градусов, смотря в какую сторону ты идешь). Всё. Расстояние от центра останется тем же, больше делать не надо ничего. Если точка лежит на НЕрадиальной стороне - то что? Правильно, надо опять изменить угол. Дистанция останется той же. Вот и всё, нарисуй картинку на бумаге, прими центр за начало ПСК, поставь несколько точек на любую сторону, и посмотри, насколько просто их зеркально отобразить... Потом просто соединяешь точки в том же порядке, что и в самом первом треугольнике, и у тебя есть отображение.
Идея интересна, немного на бумаге набросал, покрутил - получается красиво. Однако, не сложнее ли будет такое программировать(особенно если учитывать, что с таким... "полярным" программированием встречаюсь впервые, сколько пробую кодить)? Пока все же попробую еще что-нибудь придумать с декартовой системой...