Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/47: Рейтинг темы: голосов - 47, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 6
1

Два отрезка

26.07.2011, 18:59. Показов 9525. Ответов 15

Author24 — интернет-сервис помощи студентам
Добрый вечер. Напишите пожалуйста код программы на Си(не С++).
Даны координаты двух отрезков х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, то отрезки параллельны, а значит, не имеют точек пересечения.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2011, 18:59
Ответы с готовыми решениями:

Два отрезка
Не могу решить задачу, вообще ее не понимаю, объясните плз!!! вот сама задача: Два отрезка AB и...

Определить пересекаются ли два отрезка
Даны два отрезка, нужно определить пересекаются ли они и в какой точке, если пересекаются....

Написать функцию, определяющую пересекаются ли два отрезка
На вход подаются координаты начал и концов двух отрезков. Нужно определить пересекаются ли они. ...

Даны два отрезка действительной прямой. Определить, пересекаются ли они
Даны два отрезка действительной прямой. Определить, пересекаются ли они, и если да, найти длину их...

15
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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).
Поправил, вместе с ошибкой.
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 типы у всех переменных сделать...
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
27.07.2011, 12:56 4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
По моему в консоли у сканф траблы с вводом дабл лучше float типы у всех переменных сделать...
Да ладно? Первый раз слышу. Проблем со вводом через "%lf" пока не замечал.
0
Заблокирован
Автор 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;
}
Миниатюры
Два отрезка  
1
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
27.07.2011, 13:33 6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Программа не обрабатывает линии параллельные ОУ, предлагаю автору доделать эту часть самому.
Помимо этого программа находит пересечение прямых, а надо пересечение отрезков.
0
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
0
Заблокирован
Автор FAQ
27.07.2011, 14:28 8
Ну тогда используй программу, Два отрезка
или тебя смущает что для второй линии просит вводить х1, у1 - ну дык это и есть твое х3, у3

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

Не по теме:

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

0
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 6
27.07.2011, 19:27  [ТС] 12
не угадал) Или я не туда поставил функциия для ввода, потому что какие значения не ввожу получаю результат что-то типо -0,67.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
27.07.2011, 19:38 13
Ну покажи что-ль куда поставил. Функцию main покажи.
0
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;
}
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
27.07.2011, 21:01 15
%g в scanf замените на %lf
1
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 6
27.07.2011, 21:09  [ТС] 16
Спасибо, всё работает.
0
27.07.2011, 21:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2011, 21:09
Помогаю со студенческими работами здесь

Даны два отрезка действительной прямой. Определить, содержится ли один из них полностью в другом.
Доброго времени суток! Программа работает, но результат неправильный. Задача состоит в...

Создать функцию, имеющую два аргумента и возвращающую в качестве аргумента число из отрезка [a,b]
Создать функцию, которая будет иметь два целочисленных параметра a и b, и в качестве своего...

Разработать алгоритм и программу, определяющую длину отрезка и угол наклона отрезка к оси X (в градусах)
Добрый день! Поможете написать программку на плюсах, вот задание: Отрезок на плоскости задан...

Дан номер единицы длины и длина отрезка L в этих единицах. Вывести длину данного отрезка в метрах
15 Единицы длины пронумерованы следующим образом: 1 — дециметр, 2 — километр, 3 — метр, 4 —...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru