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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2023, 11:25   #1
YaLubluMamu
Пользователь
 
Регистрация: 22.10.2022
Сообщений: 37
По умолчанию Алгоритм отсечения линий Коэна-Сазерленда

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

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace cg_lab10
{
    public partial class Form1 : Form
    {
        float xmin = 1.0f, xmax = 9.0f, ymin = 1.0f, ymax = 6.0f;
        Graphics dc; Pen p;
        public Form1()
        {
            InitializeComponent();
            dc = pictureBox1.CreateGraphics();
            p = new Pen(Brushes.Red, 1);
        }
        private int IX(double x)
        {
            double xx = x * (pictureBox1.Size.Width / 10.0) + 0.5;
            return (int)xx;
        }
        //метод преобразования вещественной координаты Y в целую */
        private int IY(double y)
        {
            double yy = pictureBox1.Size.Height - y * (pictureBox1.Size.Height / 7.0) + 0.5;
            return (int)yy;
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            int i; double r, pi, alpha, phi0, phi, x0, y0, x1, y1, x2, y2;
            pi = 3.0 * Math.Atan(1.0);
            alpha = 80.0 * pi / 180.0; phi0 = 0.0; x0 = 4.0; y0 = 4.0;
            Draw(xmin, ymin, xmax, ymin); Draw(xmax, ymin, xmax, ymax);
            Draw(xmax, ymax, xmin, ymax); Draw(xmin, ymax, xmin, ymin);

            r = 3;
            x2 = x0 + r * Math.Cos(phi0); y2 = y0 + r * Math.Sin(phi0);
                for (i = 1; i <= 6; i++)
                {
                    phi = phi0 + i * alpha;
                    x1 = x2;
                    y1 = y2;
                    x2 = x0 + r * Math.Cos(phi);
                    y2 = y0 + r * Math.Sin(phi);

                    clip(x1, y1, x2, y2);
                }
            
        }

        //функция вычерчивания линии (экран 10х7 условных единиц)
        private void Draw(double x1, double y1, double x2, double y2)
        {
            Point point1 = new Point(IX(x1), IY(y1));
            Point point2 = new Point(IX(x2), IY(y2));
            dc.DrawLine(p, point1, point2);
        }
        //метод получение кода положения точки относительно окна по алгоритму Коєна-Сазерленда 
        private uint code(double x, double y)
        {
            return (uint)((Convert.ToUInt16(x < xmin) << 3) |
            (Convert.ToUInt16(x > xmax) << 2) |
            (Convert.ToUInt16(y < ymin) << 1) |
            Convert.ToUInt16(y > ymax));
        }
        //метод отсечения линий 
        private void clip(double x1, double y1, double x2, double y2)
        {
            uint c1;
            uint c2;
            double dx, dy;
            c1 = code(x1, y1);
            c2 = code(x2, y2);

            while ((c1 | c2) != 0)
            {
                if ((c1 & c2) != 0) return;
                dx = x2 - x1;
                dy = y2 - y1;
                if (c1 != 0)
                {
                    if (x1 < xmin) { y1 += dy * (xmin - x1) / dx; x1 = xmin; }
                    else
                    if (x1 > xmax) { y1 += dy * (xmax - x1) / dx; x1 = xmax; }
                    else
                    if (y1 < ymin) { x1 += dx * (ymin - y1) / dy; y1 = ymin; }
                    else
                    if (y1 > ymax) { x1 += dx * (ymax - y1) / dy; y1 = ymax; }
                    c1 = code(x1, y1);
                }
                else
                {
                    if (x2 < xmin) { y2 += dy * (xmin - x2) / dx; x2 = xmin; }
                    else
                    if (x2 > xmax) { y2 += dy * (xmax - x2) / dx; x2 = xmax; }
                    else
                    if (y2 < ymin) { x2 += dx * (ymin - y2) / dy; y2 = ymin; }
                    else
                    if (y2 > ymax) { x2 += dx * (ymax - y2) / dy; y2 = ymax; }
                    c2 = code(x2, y2);
                }
            }
            Draw(x1, y1, x2, y2); // Соединяем точки линией
        }
    }
}
YaLubluMamu вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритм отсечения FC _BYTE Помощь студентам 0 17.06.2014 13:09
алгоритм отсечения отрезков hasana Паскаль, Turbo Pascal, PascalABC.NET 0 21.10.2010 18:47
алгоритм отсечения отрезков hasana Помощь студентам 0 21.10.2010 17:45
Алгоритм Сазерленда-Ходгмана ksune4ka Помощь студентам 0 11.10.2010 20:20