Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Гриха
0 / 0 / 0
Регистрация: 25.11.2011
Сообщений: 24
#1

Длина перпендикуляра из точки к отрезку - C++

31.01.2013, 06:05. Просмотров 1541. Ответов 1
Метки нет (Все метки)

Даны координаты точки (x,y) и координаты концов отрезка (x1,y1) и (x2,y2). С точки (x,y) опущен перпендикуляр на заданный отрезок. Найти длину перпендикуляра.
Формат входных данных
Шесть чисел — координаты точки и координаты концов отрезка.
Формат выходных данных
Одно число — длину перпендикуляра. Если перпендикуляр не падает на отрезок вывести -1. Результат вывести с точностью до четырех знаков после точки.
вот цифры для проверки ответа в input.txt вводим 0 4 2 3 2 5, а должно выводиться 2.0000 но выходит не то
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
FILE *f1;
f1=fopen("input.txt","r");
FILE *f2;
f2=fopen("output.txt","w");
double x,y,x1,y1,x2,y2,s,A,B,C,T,d1,d2,min;
fscanf(f1,"%lf %lf %lf %lf %lf %lf",&x,&y,&x1,&x2,&y1,&y2);
A=y2-y1;
B=x1-x2;
C=-x1*(y2-y1)+y1*(x2-x1);
T=sqrt(A*A+B*B);
s=A*x/T + B*y/T + C/T;
fprintf(f2,"%.4lf",min);
 
}
Добавлено через 9 минут
там в конце должно быть
fprintf(f2,"%.4lf",s);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2013, 06:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Длина перпендикуляра из точки к отрезку (C++):

Найти точку пересечения отрезка и перпендикуляра, опущенного на отрезок из точки - C++
Привет! Помогите двоишнику, я же тупой батхэд :D! Есть отрезок, заданный двумя точками P1 и P2. Есть точка P3. Так вот, нужно найти...

Принадлежность точки к отрезку. - C++
УВАЖАЕМЫЕ ЭКСПЕРТЫ ПОМОГИТЕ УЛУЧшИТЬ АЛГОРИТМ ДЛЯ ДАННОЙ ЗАДАЧИ.... Точки и отрезки (Время: 2 сек) Дано N отрезков на числовой прямой...

Принадлежность точки отрезку - C++
Добрый день, уважаемые форумчане. Помогите пожалуйста с задачей. В первой строке задано два целых числа n и m (1≤n≤50000, 1≤m≤50000) —...

Найти уравнение серединного перпендикуляра - C++
Всем привет, помогите пожалуйста решить задачу: Заданы координаты концов отрезка. Найдите уравнение серединного перпендикуляра к нему. ...

появилась загвоздка с функцией. нужно вывести на экран строку, сост. из звездочек. Длина строки-параметр функциииз звезд. длина строки - - C++
Я видела, что на форуме есть подобные задачи, но ни одно из их решений не работает на моем dev cpp.:( вот вариант решения, но он не...

Найти координаты конца перпендикуляра данной длины к данному отрезку, проведённого от одного из концов отрезка - Геометрия
Дан отрезок AB, координаты точки A(3,7), B(14, 10). Отрезок CA перпендикулярен AB, как найти координаты точки C?

1
СПП
25 / 25 / 2
Регистрация: 15.12.2012
Сообщений: 71
01.02.2013, 06:58 #2
Я сделал программу с упором на С++, так как неизучал С
Я не смог портестить ваш вариант, так как мой компилятор не находит fopen, fscanf, fprintf

у меня работает, тока вывод в файл output.txt странный
у меня выводит не 2.0000 а 2.23607
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <clocale>
#include <cmath>
 
#define     iFILE       "input.txt"
#define     oFILE       "output.txt"
 
class Point {
    public:     double x;
    public:     double y;
};
 
int main(){setlocale(LC_ALL,"Rus");
    std::ifstream inp;inp.open(iFILE);
        while(!inp.is_open()){
            std::cout << "Файл не найден." << std::endl;
        system("pause");
        return 0;
        }
        Point A,B,C;
        inp >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y;
        std::ofstream ofs;ofs.open(oFILE);
            if( A.y<C.y && A.y>B.y  ||  // если А находится между С и Б
                A.y<B.y && A.y>C.y){    // если А находится между Б и С
                    double AB = sqrt(pow(B.x-A.x    ,2.0)+pow(B.y-A.y   ,2.0)); // ищем растояниие между точками А и Б
                    double CB = sqrt(pow(C.x-B.x    ,2.0)+pow(C.y-B.y   ,2.0)); // ищем растояниие между точками С и Б
                    double Bh = (1/2)*CB;                                       // ищем катит, будем искать "высоту = перпендикуляр" по теореме Пифагора
                    double Ah = sqrt(pow(AB ,2.0)-pow(Bh  ,2.0));               // <- перепендикуляр
            ofs << Ah;
            }
            else 
                ofs << -1;
        ofs.close();
    inp.close();
system("pause");
return 0;
}
Добавлено через 14 часов 1 минуту
Попровил немножко код, теперь получается всё как надо
выводит 2.0000, с 4 фиксированными знаками после запятой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <clocale>
#include <cmath>
#include <iomanip>
 
#define     iFILE       "input.txt"
#define     oFILE       "output.txt"
 
class Point {
    public:     double x;
    public:     double y;
};
 
int main(){setlocale(LC_ALL,"Rus");
    std::ifstream inp;inp.open(iFILE);
        while(!inp.is_open()){
            std::cout << "Файл не найден." << std::endl;
        system("pause");
        return 0;
        }
        Point A,B,C;
        inp >> A.x >> A.y >> B.x >> B.y >> C.x >> C.y;
        std::ofstream ofs;ofs.open(oFILE);
            if( A.y<C.y && A.y>B.y  ||      // если А находится между С и Б
                A.y<B.y && A.y>C.y){        // если А находится между Б и С
                    double AB = sqrt(pow(C.x-A.x    ,2.0)+pow(C.y-A.y   ,2.0)); // ищем растояниие между точками А и Б
                    double AC = sqrt(pow(C.x-A.x    ,2.0)+pow(C.y-A.y   ,2.0)); // ищем растояниие между точками А и С
                    double CB = sqrt(pow(C.x-B.x    ,2.0)+pow(C.y-B.y   ,2.0)); // ищем растояниие между точками С и Б
                    // полупериметр и площадь
                    double p = (AB+AC+CB)/2;
                    double S = sqrt(p*(p-AB)*(p-AC)*(p-CB));
                    // площадь треуголника S = 1/2Ah - Где A-основание треугольник, h-высота
                    // вырожаем высоту (h),  h = (2*S)/A
                    double Ah = (2*S)/CB;
            ofs << std::fixed << std::setprecision(4) << Ah;
            }
            else if(A.y==C.y && A.y>B.y ||  // если А находится на = с С и > Б
                    A.y==B.y && A.y>C.y){   // если А находится на = с Б и > С
                        double Ah = sqrt(pow(C.x-A.x    ,2.0)+pow(C.y-A.y   ,2.0));
                ofs << std::fixed << std::setprecision(4) << Ah;
                }
            else 
                ofs << -1;
        ofs.close();
    inp.close();
system("pause");
return 0;
}
чтобы вывести 4 знака после запятой нужно использовать библиотеку
C++
1
#include <iomanip>
и в std::cout или как у меня ofs
деать так
C++
1
/*ofs*/ << std::fixed << std::setprecision(4) << /*Ah;*/
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2013, 06:58
Привет! Вот еще темы с ответами:

Вычислить координаты ближайшей точки, которая принадлежит отрезку и точки на плоскости - Алгоритмы
Есть плоскость с осями x и y, на ней расположен отрезок, координаты конца A и начала B этого отрезка известны, так же есть точка на этой...

Составить каноническое уравнение перпендикуляра из точки - Геометрия
Как составить? Правила, 5.18. Запрещено размещать задания в виде картинок и других файлов с их текстом.

Задаются 4 переменных (x1,y1) и (x2,y2)-это крайние точки отрезка.Нужно найти все целочисленные точки принадлежащие этому отрезку на графике - Pascal ABC
Доброго времени суток. Задаются 4 переменных (x1,y1) и (x2,y2)-это крайние точки отрезка.Нужно найти все целочисленные точки...

Найти основание перпендикуляра, опущенного из точки на прямую - Геометрия
Необходимо решить 2 задачи,но я не понимаю каким образом это можно сделать. 1.Дан метрический тензор g_{ij}=\begin{pmatrix} 1 &amp; 2\\ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru