Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Turbo Pascal] Уравнения прямых в трапеции 
V
    Опции темы
DDV
  Дата 25.10.2006, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Если четыре точки A, B, C и D, заданные координатами на плоскости, могут быть вершинами  трапеции, найти уравнения прямых, содержащих ее высоты, опущенные из  вершин меньшего основания.
Входные данные:x1=      y1=
                            x2=       y2=
                            x3=       y3=
                            x4=       y4=
Выходные данные: урвнения прямых.
+всевозможные аномалии в в тексте программы с сообщениями о неправельном вводе. smile 

Сори не в ту тему написал, увожаемые модеры, переместите плиз тему в центр помощи, заранее спасибо.


Это сообщение отредактировал(а) DDV - 25.10.2006, 23:51
PM MAIL   Вверх
Albinos_x
Дата 26.10.2006, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 2
Всего: 108



здесь посмотри
http://forum.vingrad.ru/topic-115138/hl/ст.../all/index.html

подобное задание...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
DDV
Дата 26.10.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Это конечно хорошо, но я в этом деле чайник чайником, кроме массивов не фига не понимаю, а сдавать в субботу... smile 
PM MAIL   Вверх
anwe
Дата 26.10.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Давай сначала математику расскажу. Это не для того, чтобы тебя обидеть, сказав тем самым, что ты ничего не знаешь. Просто будет легче понять решение. Само же решение - аж смешно: 2 (именно 2!) строки (без строк ввода и вывода).
Пусть через точки (х1,у1) и (х2,у2) проходит большее (нижнее) основание, через точки (х3,у3) и (х4,у4) - меньшее. Значит, если надо опустить высоту на большее основание надо провести перпендикуляр из точек 3 и 4 на большее основание.

План решения. Находим уравнение прямой, содержащей большее основание, как уравнение прямой, проходящей через две точки:
(y-y1)/(y2-y1)=(x-x1)/(x2-x1)
Через заданную точку проводим прямую с заданной ориентацией. Говоря языком твоей программы, получится: через вершины меньшего основания проводим прямые, перепендикулярные найденной. Общее уравнение прямой y=kx+b. Общее уравнение прямой, проходящей через заданную точку имеет вид (у-у0)=к(х-х0). Условием перпендикулярности является к1*к2=-1.
Нахождение уравнения прямой через две точки программой посложнее, чем на бумаге: для сведения уравнения к общему виду, преобразований много. Поэтому пойдем по оригинальному пути.
Коэффициент k - это по определению тангенс угла наклона прямой к оси х, k=tg(a). Что такое тангенс? Это отношение противолежащего катета к прилежащему. В твоем случае как раз удобнее и быстрее найти именно его. Значит? длина противолежащего катета равна у2-у1, а прилежащего - х2-х1. Получаем 
к=(y2-y1)/(x2-x1)
Из условия перпендикулярности искомое значение коэффициента ki:=-1/k.
ВСЁ-О-О-О! Далее лишь преобразование! Для точки 3 (одна из вершин меньшего основания):
y-y3=ki(x-x3) --> y=ki(x-x3)+y3 --> y=ki*x-ki*x3+y3
Слагаемые -ki*x3+y3=b согласно вида общего уравнения - это конкретное для данного случая число.
Для прямой из второй вершины (точки 4), думаю, уравнение напишешь сам.
Теперь код. Мне проще на делфи, так что возможны ошибки - отредактируешь. smile 
Код

var
    x1,x2,x3,x4,y1,y2,y3,y4,ki,b:Real;
begin
    write('Координаты х1, у1 (через пробел): ');
    readln(х1, у1);
    write('Координаты х2, у2 (через пробел): ');
    readln(х2, у2);
    write('Координаты х3, у3 (через пробел): ');
    readln(х3, у3);
    write('Координаты х4, у4 (через пробел): ');
    readln(х4, у4);
    ki:=-1/((y2-y1)/(x2-x1));
    b:=-x3*ki+y3;
    writeln('y='+FloatToStr(ki)+'*x'+'+'+FloatTostr(b))
end.


Это сообщение отредактировал(а) anwe - 26.10.2006, 23:04
PM MAIL   Вверх
DDV
  Дата 26.10.2006, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Спасибо огромное, ТЫ МНЕ ОЧЕНЬ ПОМОГ !!!
PM MAIL   Вверх
DDV
Дата 27.10.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Принес задачу училке она говорит что решение должно быть развернутое и написано поэтапно, а не в 2 строки. Нет аномалий, а они должны быть (если не правельно заданы координаты и фигура не трапеция) smile help!
PM MAIL   Вверх
anwe
Дата 3.11.2006, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



Код

var
x1,x2,x3,x4,y1,y2,y3,y4,ki,b:Real;
trapezia:boolean;
label l1;

procedure proverka(x1,y1,x2,y2,x3,y3,x4,y4:Real);
var xk,yk,k12,k34,k23,k14:Real;          //коэффициенты уравнения (см. ранее)
massiv:array[1..8]of Real;
i,j:Word;
flag_k12,flag_k34,flag_k23,flag_k14:boolean;    //флаги если k12, k34, k23 или k14 не существуют (бесконечно большие)
label l1;
begin
trapezia:=false;
flag_k12:=true;
flag_k34:=true;
flag_k23:=true;
flag_k14:=true;
massiv[1]:=x1;
massiv[2]:=x2;
massiv[3]:=x3;
massiv[4]:=x4;
massiv[5]:=y1;
massiv[6]:=y2;
massiv[7]:=y3;
massiv[8]:=y4;
for i:=1 to 3 do
for j:=i+1 to 4 do
        begin
        if(massiv[i]=massiv[j])and(massiv[i+4]=massiv[j+4])then     //проверка, чтобы точик не лежали на одной прямой
        exit;
        end;
if x2<>x1 then
k12:=(y2-y1)/(x2-x1)
else flag_k12:=false;
if x4<>x3 then
k34:=(y4-y3)/(x4-x3)
else flag_k34:=false;
if x3<>x2 then
k23:=(y3-y2)/(x3-x2)
else flag_k23:=false;
if x4<>x1 then
k14:=(y4-y1)/(x4-x1)
else flag_k14:=false;
if flag_k12 and flag_k34 then
        if k12=k34 then
        goto l1
        else exit
else if (not flag_k12) and (not flag_k34)then
l1:
        if flag_k23 and not flag_k14 then           //если одна из боковушек - вертикаль
                begin
                yk:=(x1-x2)*k23+y2;
                if y3<y2 then
                        begin
                        if(yk>y2)or(yk<y3)then      //проверка принадлжености точки пересечения боковых отрезков трапеции
                        trapezia:=true;          //если нет - это трапеция
                        end        //иначе - пересечение внутри трапеции, то есть получается как бы 2 треугольника вершиной друг у другу
                else if y3>y2 then
                        begin
                        if(yk>x3)or(yk<x2)then
                        trapezia:=true;
                        end;
                end
        else if not flag_k23 and flag_k14 then             //если другая боковушка - вертикаль
                begin
                yk:=(x2-x1)*k14+y1;
                if y3<y2 then
                        begin
                        if(yk>y2)or(yk<y3)then
                        trapezia:=true;
                        end
                else if y3>y2 then
                        begin
                        if(yk>x3)or(yk<x2)then
                        trapezia:=true;
                        end;
                end
        else    if flag_k23 and flag_k14 then     //если обе не вертикальные (иначе - квадрат, прямоугольник, паралеллограмм или ромб - выходим)
                if k23<>k14 then
                        begin
                        xk:=(y1-y2+x2*k23-x1*k14)/(k23-k14);  //проверять можно и по иксу
                        if x3<x2 then
                                begin
                                if(xk>x2)or(xk<x3)then
                                trapezia:=true;
                                end
                        else if x3>x2 then
                                begin
                                if(xk>x3)or(xk<x2)then
                                trapezia:=true;
                                end
                        end;
end;
//основаная процедура
begin
x1:=2;      //произвольные
x2:=5;      //если надо переделай
x3:=6;      //чтобы их можно было вводить
x4:=2;
y1:=1;
y2:=1;
y3:=2;
y4:=2;
proverka(x1,y1,x2,y2,x3,y3,x4,y4);  //проверка, если основания - линии 1-2, 3-4
if trapezia then
goto l1
else
        begin
        proverka(x2,y2,x3,y3,x4,y4,x1,y1);  //проверка, если основания - линии 2-3, 4-1
        if trapezia then
                begin
                b:=x1;       //перестановка точек
                x1:=x4;     //так, чтобы
                x4:=x3;    //основаниями были
                x3:=x2;    //лиии 1-2, 3-4
                x2:=b;
                b:=y1;
                y1:=y4;
                y4:=y3;
                y3:=y2;
                y2:=b;
                goto l1;
                end
        else
                begin
                writeln('фигура не трапеция');
                exit;
                end;
        end;
l1:
if y2<>y1 then
        begin
        if(x2-x1)=0 then            //вывод, если искомые уравнения - горизонтали
        if abs(y3-y4)<abs(y2-y1)then      //определение меньшего основания
                begin
                writeln('y='+FloatToStr(y3));
                writeln('y='+FloatToStr(y4));
                exit
                end
        else
                begin
                writeln('y='+FloatToStr(y1));
                writeln('y='+FloatToStr(y2));
                exit;
                end;
        ki:=-(x2-x1)/(y2-y1);              //вывод, если уравнения имеют общий вид y=kx+b
        b:=-x3*ki+y3;
        writeln('y='+FloatToStr(ki)+'*x'+'+'+FloatTostr(b));
        b:=-x4*ki+y4;
        writeln('y='+FloatToStr(ki)+'*x'+'+'+FloatTostr(b));
        end
else              //вывод, если искомые уравнения - вертикали
        begin
        if abs(x3-x4)<abs(x2-x1)then      //определение меньшего основания
                begin
                writeln('x='+FloatToStr(x3));
                writeln('x='+FloatToStr(x4));
                end
        else
                begin
                writeln('x='+FloatToStr(x1));
                writeln('x='+FloatToStr(x2));
                end;
        end;
end;


Если надо более подробный коментарий и описание - позже.
PM MAIL   Вверх
DDV
Дата 5.11.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Огромное СПАСИБО СПАСИБО СПАСИБО !!!!!  Ты меня СПАС !!!! smile Задача отличная здал на ЗАЧЕТ !

Это сообщение отредактировал(а) DDV - 5.11.2006, 13:46
PM MAIL   Вверх
anwe
Дата 5.11.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: 9
Всего: 23



А я уж думал, что зря старался до 01:35  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.