Алгоритм общих участков

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Алгоритм общих участков

Сообщение xenomorph » 10.05.2009 (Вс) 15:48

Привет всем!

Дано:
а) х1=100, y1=200
б) x2=150, y2=300

Мне нужна формула\алгоритм как получить ОБЩИЙ участок -
т.е. в примере ответ = 50, от 150 до 200.

Мне нужны в качестве ответа как длинна так и координаты общего участка.

Условия:
1) участки могут НЕ пересекаться вообще:
а) х1=10, y1=20
б) x2=150, y2=300

2) Могут совпадать:
а) х1=150, y1=300
б) x2=150, y2=300

Заранее спасибо!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re: Алгоритм общих участков

Сообщение xenomorph » 10.05.2009 (Вс) 15:50

з.ы. да, да - по алгебре у мну 2 было в школе, но ответ всё равно нужен!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Алгоритм общих участков

Сообщение MIT » 10.05.2009 (Вс) 17:04

Хм, интересная задача. Щас запостю решение :)
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Алгоритм общих участков

Сообщение MIT » 10.05.2009 (Вс) 17:25

Вот, смотри:
Код: Выделить всё
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        Dim xs(3) As Integer
        'xs(0) = 10 : xs(1) = 20 : xs(2) = 150 : xs(3) = 300
        'xs(0) = 150 : xs(1) = 200 : xs(2) = 15 : xs(3) = 120
        'xs(0) = 150 : xs(1) = 300 : xs(2) = 150 : xs(3) = 300
        xs(0) = 100 : xs(1) = 200 : xs(2) = 150 : xs(3) = 300
        Dim x(1, 3) As Integer

        For i As Integer = 0 To 3
            x(0, i) = i
            x(1, i) = xs(i)
        Next
        For i As Integer = 0 To 3 : For j As Integer = 0 To 3 - 1
                If x(1, j) > x(1, j + 1) Then
                    x(0, j) = x(0, j) Xor x(0, j + 1) : x(0, j + 1) = x(0, j) Xor x(0, j + 1) : x(0, j) = x(0, j) Xor x(0, j + 1)
                    x(1, j) = x(1, j) Xor x(1, j + 1) : x(1, j + 1) = x(1, j) Xor x(1, j + 1) : x(1, j) = x(1, j) Xor x(1, j + 1)
                End If
            Next
        Next

        If Math.Max(xs(0), xs(1)) > Math.Min(xs(2), xs(3)) And Math.Min(xs(0), xs(1)) < Math.Max(xs(2), xs(3)) Then
            Dim i1, i2 As Integer
            If x(1, 1) < x(1, 2) Then
                i1 = x(0, 1) : i2 = x(0, 2)
            Else
                i2 = x(0, 1) : i1 = x(0, 2)
            End If

            MsgBox(String.Format("Длина пересечения: {0}; Расположена между точками {1} и {2}, принадлежащими {3} и {4} отрезку соответственно.", _
                                 Math.Abs(x(1, 1) - x(1, 2)), _
                                 xs(i1), _
                                 xs(i2), _
                                 IIf(i1 < 2, 1, 2), _
                                 IIf(i2 > 1, 2, 1)))
        Else
            MsgBox("не пересекаются")
        End If
        Application.Exit()
    End Sub


End Class


Правда особо не проверял, так что я не особо уверен в правильности алгоритма - потесть посерьезней, однако предложенные тобой тесты (и их вариации) проходят.


Добавлено
То же самое, но более наглядно:
wa_test_intersect.rar
(39.25 Кб) Скачиваний: 42
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 80

    TopList  
cron