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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.10.2013, 00:08   #1
monro86
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 31
По умолчанию Ограничить движение одного квадрата в другом

Ребята здравствуйте! Подскажите пожалуйста, я не знаю куда дальше двигаться. Задача: реализовать иерархию точка > квадрат > квадрат в квадрате. Заставить их двигаться, уменьшатся и увеличиваться. Это все я реализовал, но вот проблема: квадрат не желает двигаться внутри квадрата, который тоже двигается, все время выходит за его границы, я понимаю что нужно при создании объекта указывать параметры первого квадрата, ну вообщем помогите пожалуйста. Как реализовать движение квадрата в квадрате? Вот листинг:
Код:
class CPoint
    {
        private int x, y;
        public CPoint() { }
        public CPoint(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }
Код:
class CSquare : CPoint
    {
        Rectangle rect;
        public Pen Pen { get; set; }
 
        public int maxScrollX, maxScrollY;     // Максимальное перемещение по осям
        int maxZoom;                    // Максимальное увеличение
        public bool isRunningRight = true;     // Движение вправо или влево
        public bool isIncrease = true;  // Увеличение или уменьшение
        public int Speed { get; set; }  // Скорость
 
        /// <summary>
        /// Координата Х прямоугольника
        /// </summary>
        public int XPos
        {
            get { return rect.X; }
            set { rect.X = value; }
        }
        /// <summary>
        /// Координата Y прямоугольника
        /// </summary>
        public int YPos
        {
            get { return rect.Y; }
            set { rect.Y = value; }
        }
        /// <summary>
        /// Ширина прямоугольника
        /// </summary>
        public int Width
        {
            get { return rect.Width; }
            set { rect.Width = value; }
        }
        /// <summary>
        /// Высота прямоугольника
        /// </summary>
        public int Heigth
        {
            get { return rect.Height; }
            set { rect.Height = value; }
        }
        /// <summary>
        /// Х левой стороны
        /// </summary>
        public int Left { get { return rect.Left; } }
        /// <summary>
        /// Y правой стороны
        /// </summary>
        public int Right { get { return rect.Right; } }
        /// <summary>
        /// Y верхней стороны
        /// </summary>
        public int Top { get { return rect.Top; } }
        /// <summary>
        /// Y нижней стороны
        /// </summary>
        public int Bottom { get { return rect.Bottom; } }
 
        public CSquare() { }
        public CSquare(int x, int y, int width, int height, Pen pen, int maxScrollX, int maxScrollY, int maxZoom)
            : base (x, y)
        {
            rect = new Rectangle(x, y, width, height);
            this.Pen = pen;
            this.maxScrollX = maxScrollX;
            this.maxScrollY = maxScrollY;
            this.maxZoom = maxZoom;
        }
 
        public virtual void Draw(Graphics graphics)
        {
            graphics.DrawRectangle(Pen, rect);
        }
 
        public virtual void Move()
        {
            if (isRunningRight)
                XPos += Speed;
            else
                XPos -= Speed;
 
            if (Left < 0)
                isRunningRight = true;
            if (Right > maxScrollX)
                isRunningRight = false;
        }
 
        public virtual void Zoom()
        {
            if (isIncrease)
            {
                Width += Speed;
                Heigth += Speed;
            }
            else
            {
                Width -= Speed;
                Heigth -= Speed;
            }
 
            if (Width < 0)
                isIncrease = true;
            if (Width > maxZoom)
                isIncrease = false;
        }
    }
Код:
class CSquareInSquare : CSquare
    {
        public CSquareInSquare() { }
        public CSquareInSquare(int x,int y, int width, int height, Pen pen, int maxScrollX, int maxScrollY, int maxZomm)
            : base(x, y, width, height, pen, maxScrollX, maxScrollY, maxZomm) { }
 
        public override void Move()
        {
            if (isRunningRight)
                XPos += Speed;
            else
                XPos -= Speed;
 
            if (Left < 0)
                isRunningRight = true;
            if (Right > maxScrollX)
                isRunningRight = false;
        }
 
        public override void Zoom()
        {
            base.Zoom(); // Переделать
        }
    }
monro86 вне форума Ответить с цитированием
Старый 29.10.2013, 00:09   #2
monro86
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 31
По умолчанию

Код:
public partial class Form1 : Form
    {
        Timer timer;
        Panel panel;
        Graphics graphics;
 
        BufferedGraphics bufferedGraphics;
        BufferedGraphicsContext bufferedGraphicsContext;
 
        CSquare csquare;
        CSquareInSquare csquareinsquare;
 
        public Form1()
        {
            InitializeComponent();
 
            panel = new Panel();
            panel.Size = this.Size;
            Controls.Add(panel);
 
            graphics = panel.CreateGraphics();
            bufferedGraphicsContext = new BufferedGraphicsContext();
            bufferedGraphics = bufferedGraphicsContext.Allocate(graphics, new Rectangle(0, 0, panel.Width, panel.Height));
 
            csquare = new CSquare(panel.Width / 2, panel.Height / 2, 100, 100, Pens.Red, panel.Width, panel.Height, 150);
            csquare.Speed = 2;
 
            csquareinsquare =  new CSquareInSquare(csquare.Width / 2, csquare.Heigth /2, 40, 40, Pens.Red, csquare.Width, csquare.Heigth, 50);
            csquareinsquare.Speed = 2;
 
            timer = new Timer();
            timer.Tick += new EventHandler(timer_Tick);
            timer.Interval = 25;
            timer.Start();
        }
 
        void timer_Tick(object sender, EventArgs e)
        {
            csquare.Move();
            csquare.Zoom();
 
            csquareinsquare.Move();
            csquareinsquare.Zoom();
 
            Draw();
        }
 
        void Draw()
        {
            bufferedGraphics.Graphics.Clear(Color.White);
 
            csquare.Draw(bufferedGraphics.Graphics);
 
            csquareinsquare.Draw(bufferedGraphics.Graphics);
 
            bufferedGraphics.Render();
        }
    }
Как сделать, так что бы квадрат не выходил за границы другого квадрата?
Спасибо!
monro86 вне форума Ответить с цитированием
Старый 29.10.2013, 15:46   #3
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

CSquareInSquare должен иметь ссылку на квадрат владелец.
Имея эту ссылку при движении просто проверяйте выход за границы.
simples вне форума Ответить с цитированием
Старый 30.10.2013, 00:36   #4
monro86
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 31
По умолчанию

чуть более подробнее можно?
monro86 вне форума Ответить с цитированием
Старый 30.10.2013, 09:09   #5
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

В классе CSquareInSquare добавьте поле типа - Square.
В конструкторе CSquareInSquare добавьте параметр такого же типа.
При создании объекта CSquareInSquare передавайте в него ссылку на Square владельца.
В коде CSquareInSquare.move() - учитывайте граница квадрата владельца (голая математика, если в голове не укладывается - рисуйте на бамажке).
simples вне форума Ответить с цитированием
Старый 31.10.2013, 01:57   #6
monro86
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 31
По умолчанию

Цитата:
Сообщение от simples Посмотреть сообщение
В классе CSquareInSquare добавьте поле типа - Square.
В конструкторе CSquareInSquare добавьте параметр такого же типа.
При создании объекта CSquareInSquare передавайте в него ссылку на Square владельца.
В коде CSquareInSquare.move() - учитывайте граница квадрата владельца (голая математика, если в голове не укладывается - рисуйте на бамажке).
все добавил, но в коде CSquareInSquare.move() не получается ни как учитывать(((((( деревянная башка моя
все равно вылазит за границы
monro86 вне форума Ответить с цитированием
Старый 31.10.2013, 17:40   #7
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

А что не получается то?
simples вне форума Ответить с цитированием
Старый 01.11.2013, 00:34   #8
monro86
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 31
По умолчанию

Код:
 class CSquareInSquare : CSquare
    {
        CSquare square;

        public CSquareInSquare() { }
        public CSquareInSquare(int x,int y, int width, int height, Pen pen, int maxScrollX, int maxScrollY, int maxZomm, CSquare square)
            : base(x, y, width, height, pen, maxScrollX, maxScrollY, maxZomm) 
        {
            this.square = square;
        }

        public override void Move()
        {
            if (isRunningRight)
                XPos += Speed;
            else
                XPos -= Speed;

            if (Left < square.Left)
                isRunningRight = true;
            if (Right > square.Right)
                isRunningRight = false;

            //if (square.Left < 0)
            //    isRunningRight = true;
            //if (square.Right > maxScrollX)
            //    isRunningRight = false;
        }

        public override void Zoom()
        {
            if (isIncrease)
            {
                Width += Speed;
                Heigth += Speed;
            }
            else
            {
                Width -= Speed;
                Heigth -= Speed;
            }

            if (Width < square.Left)
                isIncrease = true;
            if (Width > maxZoom)
                isIncrease = false;
        }
    }
Незнаю, я уже в методе Zoom намудрил уже сам запутался, придется наново писать(((
monro86 вне форума Ответить с цитированием
Старый 01.11.2013, 08:45   #9
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Цитата:
Сообщение от monro86 Посмотреть сообщение
Код:
            if (Left < square.Left)
                isRunningRight = true;
тут я не только бы проверял выход за границу, но и возвращал в пределы границы
Код:
if (Left < square.Left)
{
Left = square.Left;
                isRunningRight = true;
}
То же самое и для правой границы.

Цитата:
Сообщение от monro86 Посмотреть сообщение
Код:
             if (Width < square.Left)
                isIncrease = true;
Зачем сравнивать ширину и положение левой границы? Сравнивайте ширину с шириной. И исправляйте если вышла за пределы возможного.

Последний раз редактировалось simples; 01.11.2013 в 08:49.
simples вне форума Ответить с цитированием
Старый 02.11.2013, 01:47   #10
monro86
Пользователь
 
Регистрация: 15.12.2011
Сообщений: 31
По умолчанию

Цитата:
Сообщение от simples Посмотреть сообщение
тут я не только бы проверял выход за границу, но и возвращал в пределы границы
Код:
if (Left < square.Left)
{
Left = square.Left;
                isRunningRight = true;
}
То же самое и для правой границы.


Зачем сравнивать ширину и положение левой границы? Сравнивайте ширину с шириной. И исправляйте если вышла за пределы возможного.
Дело в том что свойство Left доступно только для чтения, оно возвращает только текущую позицию, а установить ее нельзя, можно оперировать только Heigth и Width, и соответственно XPos, YPos - координатами верхнего левого угла
monro86 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск одного изображения в другом czuryk Мультимедиа в Delphi 12 29.04.2013 18:13
Поиск одного изображения в другом (переделать программу) puma1337 Общие вопросы Delphi 0 10.09.2012 21:24
поиск слова из одного массива в другом Getmanin C# (си шарп) 0 26.03.2012 16:45
Движение квадрата по наклонной плоскости. НЕ могу найти ошибку Rocky095 Помощь студентам 0 18.01.2011 16:28
Ограничить движение мыши в StringGrid??? Dersou Помощь студентам 4 10.08.2010 15:53