示例#1
0
        //Вычисление пробной функции
        //(для всех точек окна знак должен быть одинаков для каждой стороны многоугольника)
        public bool probn(Window wnd, Figure f)
        {
            List <Line> lines = f.lines;
            double      m, b;
            int         lt = 0, ld = 0, rt = 0, rd = 0;

            for (int i = 0; i < lines.Count; i++)
            {
                if (lines[i].first.y > wnd.yUp && lines[i].second.y > wnd.yUp ||
                    lines[i].first.y < wnd.yDown && lines[i].second.y < wnd.yDown)
                {
                    continue;
                }
                if ((lines[i].second.x - lines[i].first.x) != 0)
                {
                    if (lines[i].first.x > wnd.xRight && lines[i].second.x > wnd.xRight ||
                        lines[i].first.x < wnd.xLeft && lines[i].second.x < wnd.xLeft)
                    {
                        continue;
                    }

                    m  = (lines[i].second.y - lines[i].first.y) / (lines[i].second.x - lines[i].first.x);
                    b  = lines[i].second.y - m * lines[i].second.x;
                    lt = 0; ld = 0; rt = 0; rd = 0;
                    if ((wnd.yUp - m * wnd.xLeft - b) >= 0)
                    {
                        lt = 1;
                    }
                    else
                    {
                        lt = -1;
                    }

                    if ((wnd.yDown - m * wnd.xLeft - b) >= 0)
                    {
                        ld = 1;
                    }
                    else
                    {
                        ld = -1;
                    }

                    if ((wnd.yUp - m * wnd.xRight - b) >= 0)
                    {
                        rt = 1;
                    }
                    else
                    {
                        rt = -1;
                    }

                    if ((wnd.yDown - m * wnd.xRight - b) >= 0)
                    {
                        rd = 1;
                    }
                    else
                    {
                        rd = -1;
                    }

                    if (Math.Abs(lt + ld + rt + rd) != 4)
                    {
                        return(false);
                    }
                }
                else
                {
                    //если x1=x2, то в знаменателе 0
                    m  = -lines[i].first.x;
                    lt = 0; ld = 0; rt = 0; rd = 0;
                    if ((wnd.xRight + m) >= 0)
                    {
                        lt = 1;
                    }
                    else
                    {
                        lt = -1;
                    }

                    if ((wnd.xLeft + m) >= 0)
                    {
                        ld = 1;
                    }
                    else
                    {
                        ld = -1;
                    }

                    if (Math.Abs(lt + ld) != 2)
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }
示例#2
0
        private void getBorderFigure(ref double x_max, ref double x_min, ref double y_max, ref double y_min, Figure figure)
        {
            x_max = -max_coord; x_min = max_coord; y_max = -max_coord; y_min = max_coord;
            foreach (var line in figure.lines)
            {
                if (line.first.x > x_max)
                {
                    x_max = line.first.x;
                }
                if (line.first.x < x_min)
                {
                    x_min = line.first.x;
                }
                if (line.second.x > x_max)
                {
                    x_max = line.second.x;
                }
                if (line.second.x < x_min)
                {
                    x_min = line.second.x;
                }

                if (line.first.y > y_max)
                {
                    y_max = line.first.y;
                }
                if (line.first.y < y_min)
                {
                    y_min = line.first.y;
                }
                if (line.second.y > y_max)
                {
                    y_max = line.second.y;
                }
                if (line.second.y < y_min)
                {
                    y_min = line.second.y;
                }
            }
        }