Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2009, 08:12   #1
Darkwinter
Новичок
Джуниор
 
Регистрация: 28.11.2009
Сообщений: 2
Вопрос Определение геометрических фигур по координатам (Java)

есть задачка на Java:
координатная плоскость. с клавиатуры вводится 4 точки.
определить, является ли получившаяся фигура квадратом, прямоугольником или ромбом.

будет здорово если кто решит. заранее огромное спасибо.
Darkwinter вне форума Ответить с цитированием
Старый 28.11.2009, 08:16   #2
ОДИНОЧЕСТВО В СЕТИ
Любопытная Вредина
Участник клуба
 
Аватар для ОДИНОЧЕСТВО В СЕТИ
 
Регистрация: 19.06.2009
Сообщений: 1,285
По умолчанию

если все стороны равны и углы по 90 градусов - квадрат
если стороны равны попарно и углы по 90 градусов - прямоугольник
если все стороны равны и углы напротив равны - ромб
ну а если ничего из этого то четырехугольник!
Цитата:
будет здорово если кто решит
будет вообще замечательно если сами решить попытаетесь!
Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.
ОДИНОЧЕСТВО В СЕТИ вне форума Ответить с цитированием
Старый 28.11.2009, 08:49   #3
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Быть проще

При ручном вводе — с вероятностью 99,999% вообще не является «точной» геометрической фигуркой.

Вот узнал из справочника 1954 года, что все эти «ребята» (длинами своих сторон) удовлетворяют равенству
Код:
(a² + b²) · 2 = (d1)² + (d2)²
Причём, плюс к этому, у ромба и квадрата
Код:
a + c = b + d
И только лишь у квадрата:
Код:
d1 = d2
(диагонали равны).

Вот главная сложность задачи — это как из заданных 4 точками шести отрезков (см. в приложенный рисунок) выбрать стороны (a, b, c, d), а как — диагонали. Надо найти пару отрезков, пересекающихся «нутрями» (внутренними точками). Это и будут диагонали — конечно, если они не на одной прямой (что тоже хорошо бы проверять). И, в 999999 случаях из 1000000, сразу получим ответ (отрицательный): ибо у искомых фигур (а все они не просто 4-угольники — параллелограммы!) диагонали своей точкой пересечения делятся пополам, что конечно же больша-а-ая редкость.

Да-а... видать, придётся обращаться к нашим прошлогодним олимпийским чемпионам по программированию!
Изображения
Тип файла: png Six.png (6.6 Кб, 406 просмотров)

Последний раз редактировалось Sasha_Smirnov; 29.11.2009 в 03:50. Причина: параллелограмМы!
Sasha_Smirnov вне форума Ответить с цитированием
Старый 28.11.2009, 15:20   #4
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Who is who among them

Цитата:
Сообщение от ОДИНОЧЕСТВО В СЕТИ Посмотреть сообщение
если все стороны равны и углы по 90 градусов - квадрат
если стороны равны попарно и углы по 90 градусов - прямоугольник
если все стороны равны и углы напротив равны - ромб
ну а если ничего из этого то четырехугольник!

будет вообще замечательно если сами решить попытаетесь!
Четырёхугольник вовсе не обязательно: может быть и треугольник, и отрезок, и даже точка.
С другой стороны, не совпавшие ни с одной прямой 4 точки — всегда дают 4-угольник, будь он хоть ромб, хоть квадрат.

Я бы предложил, после ввода 4-й точки, такую форму ответа:
Код:
□ точка
□ отрезок
□ треугольник

□ четырёхугольник:

   □ параллелограмм:
      □ прямоугольник [□ квадрат]
      □ ромб

   □ не центральносимметричный
А при составлении блок-схемы выяснилось, что и после ввода 3-й точки (особенно с дробью) всё почти ясно!

Последний раз редактировалось Sasha_Smirnov; 29.11.2009 в 03:48. Причина: убрал трапецию.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 29.11.2009, 23:57   #5
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Нутро графопостроителя

Цитата:
Сообщение от Darkwinter Посмотреть сообщение
есть задачка на Java...заранее огромное спасибо.
Есть решение на бэйсике, поэтому «пожалуйста» так, среднее...

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

Пришлось вспомнить кое-что из школьной программы, так что и вам спасибо!
Изображения
Тип файла: png Interface.png (5.0 Кб, 434 просмотров)
Вложения
Тип файла: doc IsItPlan.doc (50.0 Кб, 41 просмотров)
Sasha_Smirnov вне форума Ответить с цитированием
Старый 30.11.2009, 00:23   #6
AxenicX
Пользователь
 
Регистрация: 21.09.2009
Сообщений: 65
По умолчанию

скалярное произведение отрезков равно их слине помноженному на косинус угла между ними, отсюда следует
Но это так мысли вслух, а вообще почитай в интернете про скалярное произведение векоторов(курс геометрии 11 класс) там все просто.
AxenicX вне форума Ответить с цитированием
Старый 30.11.2009, 04:57   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от AxenicX Посмотреть сообщение
скалярное произведение отрезков равно их длине, помноженной
А при чём тут вообще векторы? Чисто с координатами работал! По теореме Пифагора.

Ну да, она частный случай теремы косинусов, но здесь это ни к чему.
Код:
Option Explicit
Option Base 1
Dim x, y, i As Byte, TheNewRun As Boolean
Sub Tetra() 'По вводимым координатам (декартовым) определяет, задали ли вы на плоскости квадрат и пр.'
Dim a, b, c             'длины первых трёх сторон'

If Not TheNewRun Then
    x = Array(0, 2, 2, 0)   'значения координат четырёхугольника, предлагаемые по умолчанию'
    y = Array(0, 0, 2, 2)
Else
    x = Array(x(1), x(2), y(1), y(2)) 'координаты, предлагаемые при очередном запуске '
    y = Array(x(1), x(2), y(1), y(2))
End If

TheNewRun = True

x(1) = VvodkaXY(x(1)): y(1) = VvodkaXY(y(1))
x(2) = VvodkaXY(x(2)): y(2) = VvodkaXY(y(2))

If x(2) = x(1) And y(2) = y(1) Then i = 0: Exit Sub 'ВЫХОД, если 2-я точка равна 1-й'

x(3) = VvodkaXY(x(3)): y(3) = VvodkaXY(y(3))

a = Sqr((x(1) - x(2)) ^ 2 + (y(1) - y(2)) ^ 2) 'расстояние между B и C'
b = Sqr((x(1) - x(3)) ^ 2 + (y(1) - y(3)) ^ 2) 'расстояние между A и C'
c = Sqr((x(2) - x(3)) ^ 2 + (y(2) - y(3)) ^ 2) 'расстояние между A и B'

If x(3) = x(1) And y(3) = y(1) Or x(3) = x(2) And y(3) = y(2) Or _
a = b + c Or c = a + b Or b = c + a Then i = 0: Exit Sub
'(здесь мы убедились, что первые 3 точки не совпали и не легли в 1 линию)'


Select Case a = b Or b = c Or a = c
Case True: MsgBox "есть (достаточно) равные стороны"
    Select Case a * a + b * b > c * c - 0.0001 And a * a + b * b < c * c + 0.0001 Or _
                a * a + c * c > b * b - 0.0001 And a * a + c * c < b * b + 0.0001 Or _
                b * b + c * c > a * a - 0.0001 And b * b + c * c < a * a + 0.0001
                
    Case True: MsgBox "и есть прямой угол"  'какие-то 2 равных отрезка - под углом 90°'
            
            x(4) = VvodkaXY(x(4)): y(4) = VvodkaXY(y(4))              '«ставим» точку D'
            If Sqr((x(1) - x(4)) ^ 2 + (y(1) - y(4)) ^ 2) < a + 0.01 And _
                Sqr((x(1) - x(4)) ^ 2 + (y(1) - y(4)) ^ 2) > a - 0.01 Or _
                Sqr((x(2) - x(4)) ^ 2 + (y(2) - y(4)) ^ 2) < b + 0.01 And _
                Sqr((x(2) - x(4)) ^ 2 + (y(2) - y(4)) ^ 2) > b - 0.01 Or _
                Sqr((x(3) - x(4)) ^ 2 + (y(3) - y(4)) ^ 2) < c + 0.01 And _
                Sqr((x(3) - x(4)) ^ 2 + (y(3) - y(4)) ^ 2) > c - 0.01 Then _
                MsgBox "You’ve made a regular tetragon (квадрат)." Else i = 0: Exit Sub
                
    Case False: MsgBox "и нет прямого угла" 'какие-то 2 равных отрезка и не под углом 90°'
            x(4) = VvodkaXY(x(4)): y(4) = VvodkaXY(y(4))              '«ставим» точку D'
            If Sqr((x(1) - x(4)) ^ 2 + (y(1) - y(4)) ^ 2) < a + 0.01 And _
                Sqr((x(1) - x(4)) ^ 2 + (y(1) - y(4)) ^ 2) > a - 0.01 Or _
                Sqr((x(2) - x(4)) ^ 2 + (y(2) - y(4)) ^ 2) < b + 0.01 And _
                Sqr((x(2) - x(4)) ^ 2 + (y(2) - y(4)) ^ 2) > b - 0.01 Or _
                Sqr((x(3) - x(4)) ^ 2 + (y(3) - y(4)) ^ 2) < c + 0.01 And _
                Sqr((x(3) - x(4)) ^ 2 + (y(3) - y(4)) ^ 2) > c - 0.01 Then _
                MsgBox "You’ve made a rhomb (ромб)." Else i = 0: Exit Sub
    End Select
    
Case False: MsgBox "нет равных сторон"

    Select Case a * a + b * b = c * c Or _
                a * a + c * c = b * b Or _
                b * b + c * c = a * a       'оба отрезка разные - но под углом 90°'
                
    Case True: MsgBox "и есть прямой угол"
            x(4) = VvodkaXY(x(4)): y(4) = VvodkaXY(y(4))              '«ставим» точку D'
            If Sqr((x(1) - x(4)) ^ 2 + (y(1) - y(4)) ^ 2) = a Or _
                Sqr((x(2) - x(4)) ^ 2 + (y(2) - y(4)) ^ 2) = b Or _
                Sqr((x(3) - x(4)) ^ 2 + (y(3) - y(4)) ^ 2) = c Then _
                MsgBox "You’ve made a rectangle (прямоугольник)." Else i = 0: Exit Sub
                
    Case False: MsgBox "и нет прямого угла" 'любые 2 отрезка разные и не под углом 90°'
             i = 0: Exit Sub
    End Select
End Select
i = 0
End Sub


Function VvodkaXY(R): Static odd As Boolean: odd = Not odd 'переключение функции на ввод абсцисс/ординат'
If odd Then i = i + 1
R = Val(InputBox(IIf(odd, "Абсцисса", "Ордината") & " точки " & i & "." & vbLf & vbLf & _
"x(1) = " & x(1) & "; y(1) = " & y(1) & vbLf & vbLf & "x(2) = " & x(2) & "; y(2) = " & y(2) & vbLf & vbLf & _
"x(3) = " & x(3) & "; y(3) = " & y(3) & vbLf & vbLf & "x(4) = " & x(4) & "; y(4) = " & y(4), _
IIf(odd, "|abscissa ", "|ordinata ") & i & "| < 900", R))
If IsNumeric(R) And Abs(R) < 900 Then VvodkaXY = Fix(R) Else MsgBox "Много. Или «" & R & "» не число."
End Function
Прилагаю исправленную программу.
Вложения
Тип файла: doc IsItPlan.doc (49.5 Кб, 38 просмотров)

Последний раз редактировалось Sasha_Smirnov; 01.12.2009 в 04:52.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 03.12.2009, 07:01   #8
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Код:
    x = Array(x(1), x(2), x(3), x(4)) 'координаты, предлагаемые при очередном запуске'
    y = Array(y(1), y(2), y(3), y(4))
Вот так оно удобней.

Тот IsItPlan.doc, где 50.0 Кб, Загрузок: 2 — ошибка! Я бы убрал, да в моём списке вложений «Удалить» отключено.

Последний раз редактировалось Sasha_Smirnov; 03.12.2009 в 21:02.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 08.12.2009, 12:38   #9
Darkwinter
Новичок
Джуниор
 
Регистрация: 28.11.2009
Сообщений: 2
По умолчанию

спасибо Вам огромное, Sasha_Smirnov, что б я без вас делал =)
еще актуально, так что вдвойне спасибо!
с интерпритацией в яву конечно опять буду мучаться, но так как есть наглядный код то думаю теперь будет легче.
Darkwinter вне форума Ответить с цитированием
Старый 10.12.2009, 13:29   #10
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Интерпретация

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
Причём, плюс к этому, у ромба и квадрата
Код:
a + c = b + d
И у прямоугольника тоже! Так что это их общий (а не отличительный) признак.
Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
И только лишь у квадрата:
Код:
d1 = d2
(диагонали равны).
И у прямоугольника тоже!

В этих совпадениях и заключалась основная трудность ветвления алгоритма.

А ведь не так-то просто интерпретировать с VB на Java! Лучше по блок-схеме. Мою, к сожалению, убрали, да и не оптимальная она. Поможем?

Последний раз редактировалось Sasha_Smirnov; 10.12.2009 в 14:28.
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод на экран геометрических фигур KrL^^ Помощь студентам 1 10.05.2009 23:15
Распознавание простейших геометрических фигур DropYourWeapon Паскаль, Turbo Pascal, PascalABC.NET 0 10.01.2009 22:32