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.
Хм. Полярные координаты тут действительно могут облегчить жизнь в некоторых аспектах, но не во всех. При закрашивании "стеклышек" (термин из реальных калейдоскопов)) все равно придется работать в Декартовой СК. И, если уж так, то по крайней мере _я_ не вижу, почему бы не сделать простую процедурку для отражения в ДСК, и не мешать в одну кучу разные координаты..
И вообще, я не вижу проблемы в рисовании, проведении прямых и отражении - это все мелочи. Мне кажется, реальную головную боль вызовет программирование закрашивания стеклышек.. Кстати, забавно будет, если еще наложить условие, что красок только 4 .
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой