0 / 6 / 0
Регистрация: 11.05.2017
Сообщений: 5
1

Количество общих точек у двух отрезков, конвертация кода

11.05.2017, 06:20. Показов 2556. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, как звучит само задание: "Определите количество общих точек у двух отрезков, заданных координатами своих концов. Поместите на форме данные отрезки"
На этом же форуме я нашел по такой же задаче готовый код в паскале:
Pascal
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
var x11,x12,x21,x22,y11,y12,y21,y22,u1,u2: real;
 
BEGIN
    Writeln('Первый отрезок');
    Write('x1 = '); Read(x11);
    Write('y1 = '); Readln(y11);
    Write('x2 = '); Read(x12);
    Write('y2 = '); Readln(y12);
    Writeln('Второй отрезок');
    Write('x1 = '); Read(x21);
    Write('y1 = '); Readln(y21);
    Write('x2 = '); Read(x22);
    Write('y2 = '); Readln(y22);
    if (y22-y21)*(x12-x11)-(x22-x21)*(y12-y11)=0 then 
        if ((x22-x21)*(y11-y21)-(x11-x21)*(y22-y21)=0)or((x12-x11)*(y11-y21)-(y12-y11)*(x11-x21)=0) then
            writeln('Отрезки лежат на одной прямой')
            else Writeln('Отрезки лежат на параллельных прямых')
        else begin
    u1:=((x22-x21)*(y11-y21)-(x11-x21)*(y22-y21))/((y22-y21)*(x12-x11)-(x22-x21)*(y12-y11));
    u2:=((x12-x11)*(y11-y21)-(y12-y11)*(x11-x21))/((y22-y21)*(x12-x11)-(x22-x21)*(y12-y11));
    if (u1>=0)and(u1<=1)xor(u2>=0)and(u2<=1) then Writeln('Отрезки не пересекаются');
    if (u1>=0)and(u1<=1)and(u2>=0)and(u2<=1) then
        Writeln('Точка пересечения: (',x11+u1*(x12-x11),';',y11+u1*(y12-y11),')');
    end;
END.
По скольку нужно это всё дело оформить в delphi с рисованием самих отрезков на форме и тому подобного, переделал всё это таким образом:
Delphi
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
begin
if Mst(Edit_x11) or Mst(Edit_x12) or Mst(edit_y11) or Mst(edit_y12)
 or Mst(edit_x21) or Mst(edit_x22) or Mst(edit_y21) or Mst(edit_y22)
   then ShowMessage('Не все координаты введены')
   else    begin
    x11 := StrToFloat (Edit_x11.Text);
    x12 := StrToFloat (Edit_x12.Text);
    y11 := StrToFloat (Edit_y11.Text);
    y12 := StrToFloat (Edit_y12.Text);
    x21 := StrToFloat (Edit_x21.Text);
    x22 := StrToFloat (Edit_x22.Text);
    y21 := StrToFloat (Edit_y21.Text);
    y22 := StrToFloat (Edit_y22.Text);
    if (y22-y21)*(x12-x11)-(x22-x21)*(y12-y11)=0 then
        if ((x22-x21)*(y11-y21)-(x11-x21)*(y22-y21)=0)or((x12-x11)*(y11-y21)-(y12-y11)*(x11-x21)=0) then
            mess:=('Отрезки находятся на одной прямой')
            else mess:=('Отрезки находятся на параллельных прямых')
        else begin
    u1:=((x22-x21)*(y11-y21)-(x11-x21)*(y22-y21))/((y22-y21)*(x12-x11)-(x22-x21)*(y12-y11));
    u2:=((x12-x11)*(y11-y21)-(y12-y11)*(x11-x21))/((y22-y21)*(x12-x11)-(x22-x21)*(y12-y11));
    if (u1>=0)and(u1<=1)xor(u2>=0)and(u2<=1) then mess:=('Отрезки не пересекаются');
    if (u1>=0)and(u1<=1)and(u2>=0)and(u2<=1) then
        mess:=('Отрезки имеют одну общую точку');
  Label_R.Caption := mess;
  end;
  begin
with Canvas do
 
 
begin
Image1.Picture:= nil;
Image1.Canvas.Pen.Color:=clRed;
Image1.Canvas.Pen.Width:=3;
Image1.Canvas.MoveTo(Round(x11),Round(y11));
Image1.Canvas.LineTo(Round(x12),Round(y12));
Image1.Canvas.Pen.Color:=clGreen;
Image1.Canvas.MoveTo(Round(x21),Round(y21));
Image1.Canvas.LineTo(Round(x22),Round(y22));
 
end;
end;
end;
end;
Косяк в том, что не всегда выводится нужное сообщение, сообщающее об удовлетворении одному из условий, как и видно на приложенных скринах.
Есть какие нибудь предположения, в чем может быть ошибка?
Миниатюры
Количество общих точек у двух отрезков, конвертация кода   Количество общих точек у двух отрезков, конвертация кода   Количество общих точек у двух отрезков, конвертация кода  

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2017, 06:20
Ответы с готовыми решениями:

Определить количество общих точек у двух отрезков, заданных координатами своих концов
Помогите пожалуйсто. Условие задачи на Делфи Определить количество общих точек у двух отрезков,...

количество разных общих касательных для заданных двух окружностей
Я некак не могу решыть ...... Вот ети задачи : Задача №1 Васе на день рождения подарили много...

Вычислить количество общих точек двух фигур
На плоскости находятся две фигуры. Одна фигура будет фиксирована и это будет многоугольник, другая...

Найти количество общих (целых) точек (координат) у двух кругов
Нужно найти количество общих(целых) точек(координат) у двух кругов. Координаты центра окружности и...

7
Житель Земли
2999 / 2998 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
11.05.2017, 09:37 2
Цитата Сообщение от twofourty Посмотреть сообщение
Определите количество общих точек у двух отрезков, заданных координатами своих концов.
дикое описание задачи.
общая точка у двух отрезков может быть только одна - это точка пересечения. а у тебя общая точка нашлась у параллельных отрезков. это как?

я предполагаю, что общими (вернее. одинаковыми, но никак не общими) в данной задаче считаются одна из координат, как на последнем рисунке. ну так давайте называть вещи своими именами, а то Евклид в гробу перевернется
0
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
11.05.2017, 10:48 3
Цитата Сообщение от twofourty Посмотреть сообщение
Определите количество общих точек у двух отрезков,
Может быть 3 варианта: 1(пересекаются), 0(не пересекаются), бесконечное количество(частично или полностью совпадают).
0
Житель Земли
2999 / 2998 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
11.05.2017, 11:12 4
Цитата Сообщение от Puporev Посмотреть сообщение
бесконечное количество(частично или полностью совпадают).
Puporev, имеется в виду, меньший отрезок полностью лежит на большем?
0
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
11.05.2017, 11:15 5
Да если хоть какая-то часть одного отрезка совпадает с какой-то частью другого.
0
Житель Земли
2999 / 2998 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
11.05.2017, 11:18 6
блин, я в какой-то момент подумал об отрезках как о прямых и хотел возмутиться "как они могут частично совпадать?"
0
0 / 6 / 0
Регистрация: 11.05.2017
Сообщений: 5
11.05.2017, 15:38  [ТС] 7
Ну лады, а кстати говоря, вот тут может я чего с операторами намудрил? Ни разу сообщение об выполнении одного из этих условий не выводилось.
Delphi
1
2
3
4
5
    if (y22-y21)*(x12-x11)-(x22-x21)*(y12-y11)=0 then
        if ((x22-x21)*(y11-y21)-(x11-x21)*(y22-y21)=0)or((x12-x11)*(y11-y21)-(y12-y11)*(x11-x21)=0) then
            mess:=('Отрезки находятся на одной прямой')
            else mess:=('Отрезки находятся на параллельных прямых')
        else begin
0
225 / 80 / 35
Регистрация: 01.04.2017
Сообщений: 182
11.05.2017, 18:19 8
Цитата Сообщение от twofourty Посмотреть сообщение
Ни разу сообщение об выполнении одного из этих условий не выводилось.
И не будет. Вообще. Никогда.
Раз в два тря дня на форуме всплывает эта проблема, о которой почему то не говорят на лекциях.
Вещественные типы сравнивать на равенство нельзя. Больше, меньше - пожалуйста, на равенство НЕЛЬЗЯ! Точнее сравнить вы можете, ни кто не запрещает, но они почти никогда не будут равны. Почти, потому как их можно сравнить только если их значения представимы в виде конечной двоичной дроби вида m/2n.
Если вы запишите X:=0,1 думаете там будет 0,1? Да ни разу. На самом деле 0,100000000000000006.
Поэтому If x=0,1 then никогда не выполнится.
Прочтите, что такое Машинный эпсилон.
Все еще хотите сравнить? ОК. Сравнивайте модуль от числа с числом близким к нулю для данного типа.
Delphi
1
if abs((y22-y21)*(x12-x11)-(x22-x21)*(y12-y11)) < 1.0E-37 then
И это для Single, у вас Double (real - устаревший тип, замена ему Double) значит сравниваем с 2,3E−307

Цитата Сообщение от twofourty Посмотреть сообщение
var x11,x12,x21,x22,y11,y12,y21,y22,u1,u2: real;
Почему? Зачем?! Зачем вам вещественный тип данных, хотя судя по скринам все числа у вас целые?! Эх, хорошо хоть не Extended.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2017, 18:19
Помогаю со студенческими работами здесь

Нужно найти количество общих(целых) точек(координат) у двух кругов
Нужно найти количество общих(целых) точек(координат) у двух кругов. Координаты центра окружности и...

Вложенные циклы: вычислить количество общих точек двух фигур, координаты которых - целые числа
Привет всем. Помогите, пожалуйста, решить данную задачу. На плоскости находятся две фигуры. Одна...

Определите количество общих точек треугольника с отрезком
Треугольник задан координатами вершин. Определите количество общих точек данного треугольника с...

Найти количество общих точек окружности и прямой
Решить задачу в С++ Помогите пожалуйста =) Дана окружность и прямая. Окружность задается...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru