ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
РОССИЙСКОЙ ФЕДЕРАЦИИ
ТУЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Кафедра электронных вычислительных машин
«Системы искусственного интеллекта»
Лабораторная работа № 1
«Линейные решающие функции»
Выполнил: |
студент группы |
Проверил: |
Преподаватель
|
Тула 2008
Цель работы: изучение решающих функций как инструмента для определения принадлежности данного образа данной системе классов.
Тех. задание: реализовать алгоритм определения принадлежности точки треугольнику на основе линейных решающих функций.
Программа должна определять принадлежность набора точек заданному треугольнику на основании линейных решающих функций, исходные данные задаются в файле, вывод результатов также осуществляется в файл.
Сущность алгоритма определения принадлежности заданной точки рассматриваемому треугольнику заключается в следующем:
Сначала по координатам вершин треугольника строятся уравнения прямых вида Ax + By +C = 0, на которых лежат отрезки, образующие его стороны. Затем вычисляются координаты точки, несомненно лежащей внутри треугольника. Эта точка находится следующим образом: проводится медиана к одной из сторон треугольника, и середина медианы и будет искомой точкой. Далее координаты этой точки подставляются в уравнения прямых и запоминается знак полученного числа. При проверке вхождения точек в треугольник их координаты также подставляются в уравнения прямых, и, если знаки получившихся чисел совпадут с запомненными, выдвигается утверждение о том, что проверяемая точка принадлежит треугольнику.
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace lab1
{
class Program
{
static void Main(string[] args)
{
StreamReader in1 = new StreamReader("in.txt");
StreamWriter out1 = new StreamWriter("out.txt",false);
double Xa,Xb,Xc,Ya,Yb,Yc,Xm,Ym;
Xa = double.Parse(in1.ReadLine());
Ya = double.Parse(in1.ReadLine());
Xb = double.Parse(in1.ReadLine());
Yb = double.Parse(in1.ReadLine());
Xc = double.Parse(in1.ReadLine());
Yc = double.Parse(in1.ReadLine());
while (!in1.EndOfStream)
{
Xm = double.Parse(in1.ReadLine());
Ym = double.Parse(in1.ReadLine());
double Aab = Ya - Yb;
double Bab = Xb - Xa;
double Cab = Xa * Yb - Ya * Xb;
double Aac = Ya - Yc;
double Bac = Xc - Xa;
double Cac = Xa * Yc - Ya * Xc;
double Abc = Yb - Yc;
double Bbc = Xc - Xb;
double Cbc = Xb * Yc - Yb * Xc;
double Xh = (Xc - Xb) / 2 + Xb;
double Yh = (Yc - Yb) / 2 + Yb;
double Xd = (Xh - Xa) / 2 + Xa;
double Yd = (Yh - Ya) / 2 + Ya;
double Kab = Aab * Xd + Bab * Yd + Cab;
double Kac = Aac * Xd + Bac * Yd + Cac;
double Kbc = Abc * Xd + Bbc * Yd + Cbc;
int signAB = Math.Sign(Kab);
int signAC = Math.Sign(Kac);
int signBC = Math.Sign(Kbc);
Kab = Aab * Xm + Bab * Ym + Cab;
Kac = Aac * Xm + Bac * Ym + Cac;
Kbc = Abc * Xm + Bbc * Ym + Cbc;
if (Math.Sign(Kab) == signAB && Math.Sign(Kac) == signAC && Math.Sign(Kbc) == signBC)
{
Console.WriteLine("Точка с координатами ({0}, {1}) принадлежит треугольнику", Xm, Ym);
out1.WriteLine("Точка с координатами ({0}, {1}) принадлежит треугольнику", Xm, Ym);
out1.Flush();
}
else
{
Console.WriteLine("Точка с координатами ({0}, {1}) не принадлежит треугольнику", Xm, Ym);
out1.WriteLine("Точка с координатами ({0}, {1}) не принадлежит треугольнику", Xm, Ym);
out1.Flush();
}
}
Console.ReadLine();
}
}
}
Содержимое входного файла in.txt |
Содержимое выходного файла out.txt |
10 2 0 10 10 0 9 2 5 5 |
Точка с координатами (9, 2) принадлежит треугольнику Точка с координатами (5, 5) не принадлежит треугольнику |
Выводы по работе: ознакомились с примером использования линейных решающих функций.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.