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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2010, 15:13   #1
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию С# Треугольник в треугольнике.

Прошу помочь с кодом следующей задачи:
Есть три треугольника, известны координаты вершин(x;y).

Нужно
создать статический метод для проверки, располагается ли один треугольник внутри другого (входные параметры – объекты класса, результат true или false).
До последней точки с запятой в коде...
Necare вне форума Ответить с цитированием
Старый 22.10.2010, 15:30   #2
Xeonc
Форумчанин
 
Регистрация: 20.10.2010
Сообщений: 143
По умолчанию

Re: Определение нахождения точки внутри треугольника До 25 марта 00:46 нов
В ответ на: Определение нахождения точки внутри треугольника от nebel , 24 марта 2006 г.:
> Задача состоит в том, чтобы найти самый простой способ решения следующей задачи. Дано: координаты точки, координаты вершин треугольника. Выяснить: находится ли точка в треугольнике или вне треугольника (найти самую короткую формулу или алгоритм для решения задачи)? P.S.: практическое решение не приемлемо.
Пусть нам известен х, тогда проверяем в каких пределах может лежать игрек у точки.
Xa ≤ x ≤ Xc;
Запрет для у
x*(Ya-Yc)/(Xc-Xa)≤ y ≤ x*(Ya-Yb)/(Xa-Xb)
и
Xс ≤ x ≤ Xb;
Запрет для у
x*(Yс-Yb)/(Xс-Xb)≤ y ≤ x*(Ya-Yb)/(Xa-Xb)
Разницу брать по модулю, вершинам треугольника давать буквы abc, так чтобы вершина с оказывалось при проекции на ось х между a и b.


Вот найденный в гугле алгоритм нахождения точки в треугольнике, чтобы найти содержится ли треугольник в треугольнике - нужно проверить, расположены ли все 3 вершины одного треугольника, внутри другого.
451 -870-7(три)6. Выполняю работы на заказ, гарант честности - ВМ аттестат с 60+ БЛ без претензий
Xeonc вне форума Ответить с цитированием
Старый 22.10.2010, 15:41   #3
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию

Xeonc

ммм, не совсем понял про запрет. Да и вообще.

На сколько я понял х - координата по х точки, которая лежит или не лежит в треугольнике
А далее идёт проверка на у? В таком случае как я понял здесь предполагается, что х принадлежит? или я не прав. Возможно это нагло с моей стороны, но не могли бы вы немного разжевать?

Я вообще подумывал использовать формулу по которой ищется принадлежит ли точка плоскости. В моём случае 3 точки. Только не знаю как это делать без координаты z, или же делать её =0.
До последней точки с запятой в коде...

Последний раз редактировалось Necare; 22.10.2010 в 15:45.
Necare вне форума Ответить с цитированием
Старый 22.10.2010, 15:45   #4
Xeonc
Форумчанин
 
Регистрация: 20.10.2010
Сообщений: 143
По умолчанию

Эта формула - и есть расчет, принадлежит ли точка плоскости

Запрет - это ограничения для координаты y, для того, чтобы она удовлетворяла условию(расположению внутри плоскости)
451 -870-7(три)6. Выполняю работы на заказ, гарант честности - ВМ аттестат с 60+ БЛ без претензий
Xeonc вне форума Ответить с цитированием
Старый 22.10.2010, 15:54   #5
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию

это вроде:

if (x>=Xa&&x<=Xc && y>=x*(Ya-Yc)/(Xc-Xa)&&y<=x*(Ya-Yb)/(Xa-Xb)
то принадлежит

if(x<=Xb&&x>=Xc&& y>=x*(Yс-Yb)/(Xс-Xb)&&y<=x*(Ya-Yb)/(Xa-Xb)
то тоже принадлежит?

Просто у меня ну очень плохо с геометрией. Никогда её не любил.
До последней точки с запятой в коде...
Necare вне форума Ответить с цитированием
Старый 22.10.2010, 16:03   #6
Xeonc
Форумчанин
 
Регистрация: 20.10.2010
Сообщений: 143
По умолчанию

У меня тоже) Поэтому и написал, что взял алгоритм с гугла.

Напишите простейшее приложение, и проверьте его
451 -870-7(три)6. Выполняю работы на заказ, гарант честности - ВМ аттестат с 60+ БЛ без претензий
Xeonc вне форума Ответить с цитированием
Старый 22.10.2010, 16:10   #7
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию

Ммм, так я вас верно понял?

if (x>=Xa&&x<=Xc && y>=x*(Ya-Yc)/(Xc-Xa)&&y<=x*(Ya-Yb)/(Xa-Xb)
то принадлежит

if(x<=Xb&&x>=Xc&& y>=x*(Yс-Yb)/(Xс-Xb)&&y<=x*(Ya-Yb)/(Xa-Xb)
то тоже принадлежит?
До последней точки с запятой в коде...
Necare вне форума Ответить с цитированием
Старый 22.10.2010, 16:15   #8
Xeonc
Форумчанин
 
Регистрация: 20.10.2010
Сообщений: 143
По умолчанию

Насколько я понял - оба этих условия должны выполниться. Поэтому и посоветовал перепроверить в рабочем приложении
451 -870-7(три)6. Выполняю работы на заказ, гарант честности - ВМ аттестат с 60+ БЛ без претензий
Xeonc вне форума Ответить с цитированием
Старый 22.10.2010, 16:42   #9
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию

x>=Xa&&x<=Xc

x<=Xb&&x>=Xc&&

x не может быть одновременно больше и меньше Xc

в любом случае какая-то ересь.

Думал, думал и надумал:
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
 class Program
    {
        static void Main(string[] args)
        {
            int x11, y11,x12,y12,x13,y13, x1, y1, x2, y2, x3, y3;
            
            Console.WriteLine("\nВведите координаты вершин первого треугольника:");
            Console.WriteLine("x1=");
            x1 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("y1="); 
            y1 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("x2=");
            x2 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("y2="); 
            y2 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("x3=");
            x3 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("y3");
            y3 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("\n Введите координаты вершин второго треугольника: ");
            Console.WriteLine("x11=");
            x11 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("y11=");
            y11 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("x12=");
            x12 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("y12=");
            y12= Int32.Parse(Console.ReadLine());
            Console.WriteLine("x13=");
            x13 = Int32.Parse(Console.ReadLine());
            Console.WriteLine("y13=");
            y13 = Int32.Parse(Console.ReadLine());
 
            

  double r1=0,r2=0,r3=0;

  r1 = Math.Sqrt(Math.Pow((x1 - x2), 2) + Math.Pow((y1 - y2), 2));
  r2 = Math.Sqrt(Math.Pow((x2 - x3), 2) + Math.Pow((y2 - y3), 2));
  r3 = Math.Sqrt(Math.Pow((x3 - x1), 2) + Math.Pow((y3 - y1), 2));

//Проверка: образуют ли введеные вершины треугольник
  if ((r1<r2+r3)&&(r2<r1+r3)&&(r3<r1+r2)) 
  { 


  double a1=0,a2=0,a3=0,a4,a5,a6,a7,a8,a9;
  a1 = Math.Sqrt(Math.Pow((x1 - x11), 2) + Math.Pow((y1 - y11), 2));
  a2 = Math.Sqrt(Math.Pow((x2 - x11), 2) + Math.Pow((y2 - y11), 2));
  a3 = Math.Sqrt(Math.Pow((x3 - x11), 2) + Math.Pow((y3 - y11), 2));
  a4 = Math.Sqrt(Math.Pow((x3 - x12), 2) + Math.Pow((y3 - y12), 2));
  a5 = Math.Sqrt(Math.Pow((x3 - x12), 2) + Math.Pow((y3 - y12), 2));
  a6 = Math.Sqrt(Math.Pow((x3 - x12), 2) + Math.Pow((y3 - y12), 2));
  a7 = Math.Sqrt(Math.Pow((x3 - x13), 2) + Math.Pow((y3 - y13), 2));
  a8 = Math.Sqrt(Math.Pow((x3 - x13), 2) + Math.Pow((y3 - y13), 2));
  a9 = Math.Sqrt(Math.Pow((x3 - x13), 2) + Math.Pow((y3 - y13), 2));

  int flag=0;
    if ((a1<=r1) && (a1<=r2) && (a1<=r3)) flag++;
    if ((a2<=r1) && (a2<=r2) && (a2<=r3)) flag++;
    if ((a3<=r1) && (a3<=r2) && (a3<=r3)) flag++;
    if ((a4<=r1) && (a4 <= r2) && (a4 <= r3)) flag++;
    if ((a5 <= r1) && (a5 <= r2) && (a5 <= r3)) flag++;
    if ((a6 <= r1) && (a6 <= r2) && (a6 <= r3)) flag++;
    if ((a7 <= r1) && (a7 <= r2) && (a7 <= r3)) flag++;
    if ((a8 <= r1) && (a8 <= r2) && (a8 <= r3)) flag++;
    if ((a9 <= r1) && (a9 <= r2) && (a9 <= r3)) flag++;




    if (flag==9) Console.WriteLine("\n Второй треугольник лежит в первом");
    else 
        Console.WriteLine( "\n Второй треугольник не лежит в первом");
  } // Конец проверки
  else Console.WriteLine("\n Введеные вершины не образуют треугольник");



                
                
           Console.ReadKey();
 
 
            }
}}
Сравниваем длины сторон треугольника и длины сторон треугольника, образованного с помощью точки. Потом если все 3 точки лежат в треугольнике =>треугольник лежит в треугольнике.

Кто знает алгоритм по проще - искренне прошу.

вру:
Код:
a1 = Math.Sqrt(Math.Pow((x1 - x11), 2) + Math.Pow((y1 - y11), 2));
a2 = Math.Sqrt(Math.Pow((x2 - x11), 2) + Math.Pow((y2 - y11), 2));
a3 = Math.Sqrt(Math.Pow((x3 - x11), 2) + Math.Pow((y3 - y11), 2));
a4 = Math.Sqrt(Math.Pow((x1 - x12), 2) + Math.Pow((y1 - y12), 2));
a5 = Math.Sqrt(Math.Pow((x2 - x12), 2) + Math.Pow((y2 - y12), 2));
a6 = Math.Sqrt(Math.Pow((x3 - x12), 2) + Math.Pow((y3 - y12), 2));
a7 = Math.Sqrt(Math.Pow((x1 - x13), 2) + Math.Pow((y1 - y13), 2));
a8 = Math.Sqrt(Math.Pow((x2 - x13), 2) + Math.Pow((y2 - y13), 2));
a9 = Math.Sqrt(Math.Pow((x3 - x13), 2) + Math.Pow((y3 - y13), 2));
До последней точки с запятой в коде...

Последний раз редактировалось Stilet; 30.10.2010 в 15:48.
Necare вне форума Ответить с цитированием
Старый 29.10.2010, 19:05   #10
Necare
Форумчанин
 
Аватар для Necare
 
Регистрация: 22.10.2010
Сообщений: 145
По умолчанию

ересь. Алгоритм не верный. И ваще эта тема выглядит как микроблог.
До последней точки с запятой в коде...

Последний раз редактировалось Necare; 29.10.2010 в 21:58.
Necare вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++(треугольник) Runner Помощь студентам 2 13.05.2010 10:32
О треугольнике.Турбо Паскаль. SIvk Помощь студентам 6 12.03.2010 19:22
Координаты высоты в треугольнике UnChanter Помощь студентам 1 19.10.2009 07:48
Треугольник serega11 Помощь студентам 2 22.05.2008 09:01