Пусть имеются два вектора: \(a(x_1,y_1)\) и \( b(x_2,y_2)\) . Площадь параллелограмма, «натянутого» на эти вектора — это модуль косого произведения \(x_1 \cdot y_2-x_2 \cdot y_1\) векторов, а площадь «натянутого» треугольника равна половине этой площади. 
Заметим, что описанный метод нахождения площади лучше, чем формула Герона, так как не использует извлечение корня, ведущее к потере точности вычислений.

Пусть \(C(x,y)\) - координаты точки, \(A(a,b)\) - координаты начала вектора, \(B(c,d)\) - координаты конца вектора. Для начала выясним, лежит ли точка на прямой AB! Для этого необходимо вычислить косое произведение векторов AB и AC! Если оно равно нулю, тогда точка лежит на прямой! Затем вычисляем скалярное произведение векторов AB и AC! Если оно >=0, тогда точка принадлежит лучу, определяемому вектором иначе нет.

using System; 
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;

public class Check { 

double E = 1e-4;
 public struct TPoint
        {

            public double x, y;
        }
        TPoint GetVector(TPoint p1, TPoint p2)
        {
            TPoint tvector;
            tvector.x =p2.x-p1.x;
            tvector.y =p2.y-p1.y;
            return tvector;
        }

        double scamul(TPoint v1, TPoint v2)
        {
            return v1.x * v2.x + v1.y * v2.y;
        }

        bool PointEquil(TPoint A, TPoint B)
        {
           return (Math.Abs(A.x - B.x) < E && Math.Abs(A.y - B.y) < E);
        }

public string Execute()
 { 
try{

         CultureInfo culture;
            culture = CultureInfo.CreateSpecificCulture("en-US");
            Thread.CurrentThread.CurrentCulture = culture;

   List<string> output = new List<string>();
            using (System.IO.StringReader reader = new System.IO.StringReader("{1}"))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    output.Add(line.Trim());

                }
            }
            List<string> ouf = new List<string>();
            using (System.IO.StringReader reader = new System.IO.StringReader("{2}"))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    ouf.Add(line.Trim());

                }
            }
            int[] inf = Array.ConvertAll("{I}".Trim().Split(new[] { "\\r\\n", "\r", "\n", " " }, StringSplitOptions.RemoveEmptyEntries), int.Parse);

            TPoint center,p;
            center.x= inf[0];
            center.y = inf[1];
            int r = inf[2];
            p.x = inf[3];
            p.y = inf[4];

            int K1 = int.Parse(output[0]);
            int K2 = int.Parse(ouf[0]);
            if (K1 != K2) return "Wa";
            if (K1 == 0) return "Accepted";
            
            TPoint A1, B1, A2,B2;
            double[] ans1 = Array.ConvertAll(output[1].Trim().Split(new[] { "\\r\\n", "\r", "\n", " " }, StringSplitOptions.RemoveEmptyEntries), double.Parse);
            double[] ouf1 = Array.ConvertAll(ouf[1].Trim().Split(new[] { "\\r\\n", "\r", "\n", " " }, StringSplitOptions.RemoveEmptyEntries), double.Parse);

            A1.x = ans1[0];
            A1.y = ans1[0];
            B1.x = ouf1[0];
            B1.y = ouf1[0];

            if (K1 == 1)
                if (PointEquil(A1, B1))
                    return "Accepted";
                else
                    return "Wa";


            else {
                double[] ans2 = Array.ConvertAll(output[2].Trim().Split(new[] { "\\r\\n", "\r", "\n", " " }, StringSplitOptions.RemoveEmptyEntries), double.Parse);
                double[] ouf2 = Array.ConvertAll(ouf[2].Trim().Split(new[] { "\\r\\n", "\r", "\n", " " }, StringSplitOptions.RemoveEmptyEntries), double.Parse);

                A2.x = ans2[0];
                A2.y = ans2[0];
                B2.x = ouf2[0];
                B2.y = ouf2[0];
                if ((PointEquil(A1, B1) && PointEquil(A2, B2)) || (PointEquil(A2, B1) && PointEquil(A1, B2)))  
                    return "Accepted";
                        else return "Wa";
            }
               
}
catch(Exception e){ 
  return "Presentation Error"+e;
}
}
}
 

Определения и понятия

Вектор - это направленный отрезок, который задаётся 2-мя координатами.


Умножение вектора на число k - это изменение его длины в k раз. При \(k < 0\) вектор развернётся.

Длина вектора вычисляется по формуле \(\sqrt {x^2 + y^2}\)

Нормированный вектор - вектор единичной длины, получается при делении вектора на его длину.

Сумма векторов получается, если построить второй вектор от конца первого, и пустить вектор в получившуюся точку.

Если x1, y1, x2, y2 - координаты первого и второго векторов, соответственно, то их сумма - вектор с координатами \((x_1 + x_2) \)и \((y_1 + y_2) \).

Разность векторов - сумма, где второй вектор развёрнут (умножен на -1).

Скалярное произведение векторов - число, проекция одного вектора на другой умноженная на его длину. В простейшем случае обычного евклидового пространства иногда используют «геометрическое» определение скалярного произведения ненулевых векторов a и b как произведения длин этих векторов на косинус угла между ними: 
\(a \cdot b = |a| \cdot |b| \cdot cos \alpha\).

Для скалярного произведения вектором справедлива следующая формула:
\(a \cdot b = x_1 \cdot x_2 + y_1 \cdot y_2\)
где x1, y1, x2, y2 - координаты первого и второго вектора, соответственно, позволяет определить, лежит ли второй вектор в той же полуплоскости, что и первый.

Векторное произведение векторов - вектор в трёхмерном пространстве перпендикулярный обоим векторам, по длине равен ориентированной площади параллелограмма, построенного на этих векторах. Произведение длин векторов на синус угла между ними, причём знак этого синуса зависит от порядка операндов: \(a\ х \ b = |a| \cdot |b| \cdot sin \alpha\) 

Если вычислять через координаты:
\(a\ х\ b = x_1 \cdot y_2 + x_2 \cdot y_1\),
где x1, y1, x2, y2 - координаты первого и второго вектора, соответственно, позволяет определить, по какую сторону от прямой, на которой лежит первый вектор, находится второй вектор. Также позволяет находить ориентированную площадь треугольников и параллелограммов.

Поворот вектора выполняется с помощью чёрной магии тайных адептов геометрии Лобачевского.
Чтобы повернуть вектор на угол \(\alpha\) против часовой стрелки (\(\alpha <= 2 \cdot \pi\), привыкайте к углам в радианах), нужно домножить вектор на такую вот матрицу:
\(\begin{bmatrix} \cos \alpha & -sin \alpha \\ \sin \alpha & cos \alpha \end{bmatrix}\)

Что значит домножить вектор на матрицу? Допустим координаты нашего вектора равны x и y, тогда произведение этого вектора и нашей матрицы будет равно вектору с координатами x' и y':
\(x' = x \cdot cos \alpha - y \cdot sin \alpha \\ y' = x \cdot sin \alpha + y \cdot cos\alpha\)

Вот и получаем новый вектор точно такой же длины, но уже повернутый на угол А против часовой стрелки.

Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация