Форум программистов, компьютерный форум CyberForum.ru

Два отрезка - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Disok
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 6
26.07.2011, 18:59     Два отрезка #1
Добрый вечер. Напишите пожалуйста код программы на Си(не С++).
Даны координаты двух отрезков х1,у1 и х2,у2, нужно найти точку пересечения этих отрезков.
Как её решить я знаю, а вот как написать саму программу не знаю. Для нахождения пересечения надо составить два уравнения (x-x1)/(x2-x1)=(y-y1)/(y2-y1) и (x-x3)/(x4-x3)=(y-y3)/(y4-y3), потом найти х и у, так как прямые пересекаются, то у них есть общая точка пересечения с координатами (х,у), которую нам и надо найти. Еще надо проверить параллельность этих отрезков при помощи угловых коэффициентов: к1=(x2-x1)/(y2-y1); к2=(x4-x3)/(y4-y3);
где k1 и k2 – тангенсы угла наклона отрезков к положительному направлению оси ОХ, если k1=k2, то отрезки параллельны, а значит, не имеют точек пересечения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2011, 18:59     Два отрезка
Посмотрите здесь:

Два отрезка C++
подскажите что с кодом не так? (просуммировать два раза по два столбца, функция) C++
Известно, что среди элементов массива два и только два равны между собой. Напечатать их индексы C++
Дан номер единицы длины и длина отрезка L в этих единицах. Вывести длину данного отрезка в метрах C++
Написать функцию, определяющую пересекаются ли два отрезка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.07.2011, 11:19     Два отрезка #2
Я так не сумею. Так что сделал, как смог
Ввод точек как-нибудь сам.
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
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <float.h>
#include <math.h>
 
int segment_intersection(
        double x1, double y1, double x2, double y2, /* 1st segment */
        double x3, double y3, double x4, double y4, /* 2nd segment */
        double *xi, double *yi) /* intersection point */
{
    double dx1, dx2, dy1, dy2, D, t;
 
    dx1 = x2 - x1;
    dy1 = y2 - y1;
    dx2 = x4 - x3;
    dy2 = y4 - y3;
    
    D = dx2 * dy1 - dx1 * dy2;
    
    t = dx1 * (y3 - y1) - dy1 * (x3 - x1);
    if (D*t < 0 || fabs(t) > fabs(D))
        return 0; /* No intersection */
 
    t = dx2 * (y3 - y1) - dy2 * (x3 - x1);
    if (D*t < 0 || fabs(t) > fabs(D))
        return 0; /* No intersection */
    
    if (fabs(D) < DBL_MIN)
        return -1; /* Unknown */
 
    t /= D;
    *xi = t*dx1+x1;
    *yi = t*dy1+y1;
 
    return 1; /* One intersection */
}
 
int main(void)
{
    double xi =  0.0, yi =  0.0;
    double x1 =  1.0, y1 =  1.0;
    double x2 = -1.0, y2 = -1.0;
    double x3 = -1.0, y3 =  0.0;
    double x4 =  0.0, y4 = -2.0;
 
    switch (segment_intersection(x1, y1, x2, y2, x3, y3, x4, y4, &xi, &yi))
    {
        case 1:
            printf("Intersection point: (%g, %g)\n", xi, yi);
            break;
        case 0:
            printf("Line segments has not intersection\n");
            break;
        default:
            printf("Unknown\n");
    }
 
    return 0;
}
Добавлено через 8 часов 20 минут
Возврат в строке 28 означает, что отрезки лежат на одной прямой, поэтому количество общих точек неизвестно. Их может быть 0, одна или бесконечное количество. Пожалуй там стоит вернуть особое значение, например -1.
Тогда функция возвращает количество общих точек: 0, 1, не определено (-1).
Поправил, вместе с ошибкой.
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2011, 12:49     Два отрезка #3
Цитата Сообщение от Disok Посмотреть сообщение
Даны координаты двух отрезков х1,у1 и х2,у2, нужно найти точку пересечения этих отрезков.
У отрезков всегда координаты начала и конца, х1,у1 и х2,у2 - это координаты 2-х точек, может известны координаты начала скажем х1, у1 и конца х2,у2 для кадого отрезка???

Добавлено через 3 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ввод точек как-нибудь сам.
По моему в консоли у сканф траблы с вводом дабл лучше float типы у всех переменных сделать...
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.07.2011, 12:56     Два отрезка #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
По моему в консоли у сканф траблы с вводом дабл лучше float типы у всех переменных сделать...
Да ладно? Первый раз слышу. Проблем со вводом через "%lf" пока не замечал.
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2011, 13:15     Два отрезка #5
Вот простенький код нахождения точки пересечения. Математика по вычислению углового коэффициента прямой и смещения есть в скриншоте по ссылке Окружность и прямая.
Программа не обрабатывает линии параллельные ОУ, предлагаю автору доделать эту часть самому.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <conio.h>
 
float k_coeff(float x1, float y1, float x2, float y2);
float b_coeff(float x1, float y1, float x2, float y2);
void get_line(float &x1, float &y1, float &x2, float &y2);
 
void raschet();
 
int main()
{
    while(true)
    {
        raschet();
        printf("Press NUM 1 to enter new lines\r\n");
        if('1' != getch())
            break;
    }
    printf("Press any key to continue\r\n");
    getch();
    return 0;
}
 
void get_line(float &x1, float &y1, float &x2, float &y2)
{
    printf("Enter coordinates of strat x1,y1 and end of line x2,y2\r\n");
    printf("x1 = ");scanf("%g",&x1);
    printf("y1 = ");scanf("%g",&y1);
    printf("x2 = ");scanf("%g",&x2);
    printf("y2 = ");scanf("%g",&y2);
}
 
void raschet()
{
    float x1,x2,y1,y2,x3,y3,x4,y4,X,Y;
    printf("\t1-st line\r\n");
    get_line(x1, y1, x2, y2);
    printf("\t2-nd line\r\n");
    get_line(x3, y3, x4, y4);
 
    float k1 = k_coeff(x1, y1, x2, y2);
    float b1 = b_coeff(x1, y1, x2, y2);
 
    float k2 = k_coeff(x3, y3, x4, y4);
    float b2 = b_coeff(x3, y3, x4, y4);
 
    if(k1 != k2)
    {
        X = (b1 - b2)/(k2 - k1);
        Y = k1*X + b1;
        printf("\tCoordinates of cross-point\r\n");
        printf("O(%g;%g)\r\n",X,Y);
    }
}
 
float k_coeff(float x1, float y1, float x2, float y2)
{
    float k = 0;
    if(x1 != x2)
        k = (y2 - y1)/(x2 - x1);
    return k;
}
 
float b_coeff(float x1, float y1, float x2, float y2)
{
    float b = 0;
    if(x1 != x2)
        b = (y2*x1 - y1*x2)/(x1 - x2);
    return b;
}
Миниатюры
Два отрезка  
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.07.2011, 13:33     Два отрезка #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Программа не обрабатывает линии параллельные ОУ, предлагаю автору доделать эту часть самому.
Помимо этого программа находит пересечение прямых, а надо пересечение отрезков.
Disok
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 6
27.07.2011, 13:53  [ТС]     Два отрезка #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
У отрезков всегда координаты начала и конца, х1,у1 и х2,у2 - это координаты 2-х точек, может известны координаты начала скажем х1, у1 и конца х2,у2 для кадого отрезка???

Да я не правильно написал, даны координаты 1 отрезка х1,у1 х2,у2 и 2-ого отрезка х3,у3 х4,у4
-=ЮрА=-
Заблокирован
Автор FAQ
27.07.2011, 14:28     Два отрезка #8
Ну тогда используй программу, Два отрезка
или тебя смущает что для второй линии просит вводить х1, у1 - ну дык это и есть твое х3, у3

Добавлено через 3 минуты
Цитата Сообщение от grizlik78 Посмотреть сообщение
Помимо этого программа находит пересечение прямых, а надо пересечение отрезков.
Ты прав, тогда нужно проверить принадлежность X диапазону [x1;x2] и [x3;x4]
Disok
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 6
27.07.2011, 16:14  [ТС]     Два отрезка #9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ты прав, тогда нужно проверить принадлежность X диапазону [x1;x2] и [x3;x4]
А можешь это дописать если не трудно пожалуйста.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.07.2011, 16:18     Два отрезка #10
Disok, моя-то функция чем не угодила?
easybudda
27.07.2011, 18:54
  #11

Не по теме:

Цитата Сообщение от grizlik78 Посмотреть сообщение
моя-то функция чем не угодила?
Сейчас угадаю:
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ввод точек как-нибудь сам.

Disok
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 6
27.07.2011, 19:27  [ТС]     Два отрезка #12
не угадал) Или я не туда поставил функциия для ввода, потому что какие значения не ввожу получаю результат что-то типо -0,67.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.07.2011, 19:38     Два отрезка #13
Ну покажи что-ль куда поставил. Функцию main покажи.
Disok
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 6
27.07.2011, 21:00  [ТС]     Два отрезка #14
Код
int main(void)
{
	double x1,x2,x3,x4,y1,y2,y3,y4,xi,yi;
printf("Vvedite koordinaty linii 1 \n");
        printf("x1 = "); scanf("%g",&x1);
        printf("y1 = "); scanf("%g",&y1);
        printf("x2 = "); scanf("%g",&x2);
        printf("y2 = "); scanf("%g",&y2);
printf("Vvedite koordinaty linii 2 \n");
        printf("x3 = "); scanf("%g",&x3);
        printf("y3 = "); scanf("%g",&y3);
        printf("x4 = "); scanf("%g",&x4);
        printf("y4 = "); scanf("%g",&y4);
  
 
    switch (segment_intersection(x1, y1, x2, y2, x3, y3, x4, y4, &xi, &yi))
    {
        case 1:
            printf("Intersection point: (%g, %g)\n", xi, yi);
            break;
        case 0:
            printf("Line segments has not intersection\n");
            break;
        default:
            printf("Unknown\n");
    }
 
    return 0;
}
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.07.2011, 21:01     Два отрезка #15
%g в scanf замените на %lf
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2011, 21:09     Два отрезка
Еще ссылки по теме:

C++ Даны два отрезка действительной прямой. Определить, содержится ли один из них полностью в другом.
Последовательность целых чисел. Найти два минимальных / два максимальных элемента C++
Даны два отрезка действительной прямой. Определить, пересекаются ли они C++

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

Или воспользуйтесь поиском по форуму:
Disok
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 6
27.07.2011, 21:09  [ТС]     Два отрезка #16
Спасибо, всё работает.
Yandex
Объявления
27.07.2011, 21:09     Два отрезка
Ответ Создать тему

Метки
отрезок, пересечение
Опции темы

Текущее время: 19:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru