Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Резиновый" эллипс, Ну,приблизительно, как "резиновая" линия 
:(
    Опции темы
lioness
Дата 27.7.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Чтобы тянулся следом, как "резиновая" линия?  На манер   DrawReversibleLine ?  Не существует такого метода?  А как тогда сделать? smile    Ну, например, "резиновый" прямоугольник и чтобы в него потом вписался эллипс.... Наискосок на любой угол... Что-то DrawEllipse лепит совершенно тупо только горизонтально  smile  
PM MAIL   Вверх
ivashkanet
Дата 27.7.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



lioness, ты про что? 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 27.7.2006, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



lioness, тут на самом деле 2 вопроса: как нарисовать "резиновую фигуру", тянущуюся за курсором; и как нарисовать повёрнутый эллипс. Вопрос номер 1 решается очень просто - частой перерисовкой. Вопрос номер 2 решается не так просто - выставлением угла поворота перед отрисовкой эллипса с пом. DrawEllipse:

Код
graphics.RotateTransform(angle)

 


--------------------
user posted image
PM MAIL WWW   Вверх
lioness
Дата 28.7.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Конечно, два вопроса  smile  Сейчас попробую повернуть. А я и не знала про ротацию. Ну а прорисовывать на каждое движение мышки - это я уже набросала текстик.  smile  Подумала, вдруг выдумываю велосипед и это "живое" движение уже есть в каком-нибудь классе.  smile  

Что-то у меня учебники плохие. Сейчас поискала в них про RotateTransform - и ничего... На microsoft пойду почитаю...  
PM MAIL   Вверх
lioness
Дата 28.7.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



А почему у microsoft-a три конструктора для RotateTransform указано. Среди них - один с центром поворота, а у меня в Visual Studio подсказка выходит только для двоих: angle (угол, соответственно)  и  angle с MatrixOrder. 
Может, у меня Visual Studio неправильный какой-нибудь?  

А простой конструктор с angle (The default center of rotation is the origin) крутит нелогично со своей ориджиновской точкой. Конструктор с тремя double (угол, координата, координата центра) - не жрЁтЬ  smile  
PM MAIL   Вверх
mr.DUDA
Дата 28.7.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Сначала можно передвинуть ориджин в центр эллипса с пом. TranslateTransform, где dx и dy - отрицательные координаты. Потом применить RotateTransform с указанием только угла. Потом рисовать эллипс.

З.Ы. 
Цитата(lioness @  28.7.2006,  13:41 Найти цитируемый пост)
Может, у меня Visual Studio неправильный какой-нибудь?  

А какая версия студии ? 2003 или 2005 ? 


--------------------
user posted image
PM MAIL WWW   Вверх
lioness
Дата 28.7.2006, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Здесь в бюро 2003.  Да он повернул мне мой эллипс благополучно, но выглядит это приблизительно, как этот повернутый текст. 
user posted image (почему-то на какой-то яве нашла примеры  для C#smile ) 

Вот даже если текст (горизонтально стоит исходный вариант). Если поворачивается вокруг левого-верхнего угла, то какого лешего начинает так "загребать" по спирале какой-то. Эллипсы  у меня еще больше вразлет пошли...
Попробую центр сместить.  Спасибо, что помогаете  smile  Здесь все кругом жавщики сидят, а я одна  smile с си-шарпом.  
PM MAIL   Вверх
lioness
Дата 31.7.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Да вокруг какой точки он вращает-то???????  smile   Я не вижу здесь у майкрософта упоминания об этом  http://msdn.microsoft.com/library/default....nsformtopic.asp 

TranslateTransform старательно передвигает объекты на заданное локальное смещение.  Разве это объявление центра??  А вот Rotate ВОКРУГ чего крутит !   Я была уверена вокруг левого верхнего угла прямоугольника, который опИсывает эллипс.  Но что-то делает не то: крутанет и сместит куда-то  smile  
PM MAIL   Вверх
mr.DUDA
Дата 31.7.2006, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



lioness, для эллипса всё похоже вертится вокруг левой верхней вершины прямоугольника, описывающего этот эллипс.
 


--------------------
user posted image
PM MAIL WWW   Вверх
lioness
  Дата 1.8.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Да, это я уже заметила. Оказывается, вот что меня спутало и не знаю, как это исправить.

Если я смещаю  с помощью TranslateTransform (если не сделаю сдвиг, то он, зараза, норовит повернуться вокруг нулевой точки).  Потом поворачиваю на нужный мне угол. Все нормально ОДИН раз. На следующей фигуре начинает плясать от последнего встретившегося транслейта и angle и, кажется, суммирует предыдущий с текущим. Попробовала проэкспериментировать с MatrixOrder.Append и Prepend - что-то как мертвому припарки. 

На простом примере я рисую эллипс, потом сдвигаю угол Rotate  ВЗАД  smile : просто на тот же угол, только с минусом. И Translate тоже. Но ничего не рисую. Потом рисую другой эллипс и задаю для него свой угол и смещение. Вроде бы все работает.

Но если уже идет все в динамике: я указываю мышкой направление для рисования эллипса, то все эти транслейты и ротации "утаскивают" эллипс вообще в сторону за пределы окна.

А "резиновый" эллипс у меня уже работает, НО ТОЛЬКО КОГДА Я ЕГО НЕ ПОВОРАЧИВАЮ. Он увеличивается и уменьшается следом за движением мышки, но только в горизонтальной позиции. А я хочу, чтобы он увеличивался от точки, где был MouseDown и вытягивался под любым углом следом за текущей позиции мышки. 

Но как мне "обнулить" Rotate и Translate  smile , чтобы динамично нарисовала-стерла, мышку двинула, нарисовала-стерла.

Добавлено @ 16:08 
Вот если не сделать в этом коде движение с "минусом" ( я выделила звездочками), то последний эллипс уедет резко вправо. Рисуются просто все подряд, но угол наклона последнего я подсчитываю по двум точкам.
Код

        using System;
        using System.Drawing;
        using System.Collections;
        using System.ComponentModel;
        using System.Windows.Forms;
        using System.Drawing.Drawing2D;

        namespace WindowsApp_Rotation_Experimenten
        {
            /// <summary>
            /// Summary description for TranslateTransform.
            /// </summary>
            public class TranslateTransform : System.Windows.Forms.Form
            {
                /// <summary>
                /// Required designer variable.
                /// </summary>
                

                float height = 200;
                float width  = 80;
                float angle = 0;
                private System.Windows.Forms.Label currAngle;

                private System.ComponentModel.Container components = null;

                public TranslateTransform()
                {
                    //
                    // Required for Windows Form Designer support
                    //
                    InitializeComponent();

                    //
                    // TODO: Add any constructor code after InitializeComponent call
                    //
                }

                /// <summary>
                /// Clean up any resources being used.
                /// </summary>
                protected override void Dispose( bool disposing )
                {
                    if( disposing )
                    {
                        if(components != null)
                        {
                            components.Dispose();
                        }
                    }
                    base.Dispose( disposing );
                }

                #region Windows Form Designer generated code
                /// <summary>
                /// Required method for Designer support - do not modify
                /// the contents of this method with the code editor.
                /// </summary>
                private void InitializeComponent()
                {
                    this.currAngle = new System.Windows.Forms.Label();
                    this.SuspendLayout();
                    // 
                    // currAngle
                    // 
                    this.currAngle.Location = new System.Drawing.Point(24, 24);
                    this.currAngle.Name = "currAngle";
                    this.currAngle.TabIndex = 0;
                    // 
                    // TranslateTransform
                    // 
                    this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
                    this.ClientSize = new System.Drawing.Size(392, 366);
                    this.Controls.Add(this.currAngle);
                    this.Name = "TranslateTransform";
                    this.Text = "TranslateTransform";
                    this.Paint += new System.Windows.Forms.PaintEventHandler(this.TranslateTransform_Paint);
                    this.ResumeLayout(false);

                }
                #endregion

                private void TranslateTransform_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
                {
                    // Set world transform of graphics object to translate.
                    e.Graphics.TranslateTransform(100.0F, 100.0F);
                    // Then to rotate, prepending rotation matrix.
                    e.Graphics.DrawEllipse(new Pen(Color.Red, 3), 0, 0, height, width);
                    e.Graphics.DrawRectangle(new Pen(Color.Black,1), 0, 0, height, width);
                    angle = -45.0F;
                    e.Graphics.RotateTransform(angle);
                    // Draw rotated, translated ellipse to screen.
                    float arg1 =(float) Math.Round(0.5*width*Math.Sin(Math.PI * angle / 180.0));
                    float arg2 =(float) Math.Round(0.5*width*(1-Math.Cos(Math.PI * angle / 180.0)));

                    e.Graphics.DrawEllipse(new Pen(Color.White, 3), 0, 0, height, width);
                    e.Graphics.DrawRectangle(new Pen(Color.Black,1), 0, 0, height, width);

                    e.Graphics.TranslateTransform(arg1,-arg2);
                    e.Graphics.DrawEllipse(new Pen(Color.Blue, 3), 0, 0, height, width);
                    e.Graphics.DrawRectangle(new Pen(Color.Black,1), 0, 0, height, width);
//***************************************************************************************
                    e.Graphics.RotateTransform(-angle);
                    e.Graphics.TranslateTransform(-arg1,arg2);
                    e.Graphics.TranslateTransform(-100,-100);
//***************************************************************************************
                    Point p1,p2;
//                    p1 = new Point(120,200); p2 = new Point (80,280);
//                    p1 = new Point(80,280); p2 = new Point (120,200);
                    p1 = new Point(154,306); p2 = new Point (311,250);
//                    p1 = new Point(141,339); p2 = new Point (181,240);
//                    p1 = new Point(271,204); p2 = new Point (541,224);
                    e.Graphics.DrawLine(new Pen(Color.LawnGreen, 1),p1, p2);

                    Rectangle rc = new Rectangle();

                    // Normalize the rectangle.
                    if( p1.X < p2.X )
                    { rc.X = p1.X;    rc.Width = p2.X - p1.X;    }
                    else
                    { rc.X = p2.X;    rc.Width = p1.X - p2.X;    }
                    if( p1.Y < p2.Y )
                    {rc.Y = p1.Y;    rc.Height = p2.Y - p1.Y;}
                    else {    rc.Y = p2.Y;    rc.Height = p1.Y - p2.Y; }
                    //e.Graphics.DrawRectangle(new Pen(Color.Black,1),rc.X,rc.Y,rc.Width,rc.Height);

                    height = rc.Height;
                    rc.Height = (int) Math.Round(Math.Sqrt(rc.Height*rc.Height+rc.Width*rc.Width));
                    if (height < rc.Width) rc.Width =(int) height;
                    double  tmp = (p2.Y-p1.Y);
                    double tmp1 = (p2.X-p1.X);
                    tmp = tmp/tmp1;
                    
                    tmp = Math.Atan(tmp);
                    tmp =  Math.Atan(tmp)*180/Math.PI;
                    angle = (float) Math.Round(tmp);
                    e.Graphics.TranslateTransform(rc.X,rc.Y);
                    e.Graphics.RotateTransform(angle);
                    //e.Graphics.DrawEllipse(new Pen (Color.Cyan, 3), 0, 0, rc.Height, rc.Width);
                    //e.Graphics.DrawRectangle(new Pen(Color.Black,1),0, 0,rc.Height,rc.Width);

                    arg1 =(float) Math.Round(height*Math.Sin(Math.PI * angle / 180.0));
                    arg2 =(float) Math.Round(height*Math.Cos(Math.PI * angle / 180.0)-0.5*rc.Width);
                    e.Graphics.TranslateTransform(arg1,arg2);

                    e.Graphics.DrawEllipse(new Pen (Color.Magenta, 3), 0, 0, rc.Height, rc.Width);
                    //e.Graphics.DrawRectangle(new Pen(Color.Black,1),0, 0,rc.Height,rc.Width);
                }

                
                [STAThread]
                static void Main() 
                {
                    Application.Run(new TranslateTransform());
                }
            }
        }

PM MAIL   Вверх
mr.DUDA
Дата 1.8.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Цитата(lioness @  1.8.2006,  15:58 Найти цитируемый пост)
 На следующей фигуре начинает плясать от последнего встретившегося транслейта и angle и, кажется, суммирует предыдущий с текущим. 

А, ну так если только в этом дело - специально для сохранения и восстановления состояния Graphics (повороты, translate, scale - в общем, трансформации) служит пара методов Save / Restore класса Graphics. Просто вызываем Save до Translate/Rotate, и после отрисовки одной фигуры вызываем Restore.


--------------------
user posted image
PM MAIL WWW   Вверх
lioness
Дата 1.8.2006, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



Во ! Чего нашла http://www.c-sharpcorner.com/Code/2002/Mar...inesNShapes.asp
ПодпИсано:  энтузиаст из Бразилии  smile   Где много диких обезьян  smile 

Вот он что-то изобразил с Bitmap... Я так пока не умею...  Мож, так легче прорисовывать  smile 

А эллипс-то  у него резиновый т-о-л-ь-к-о   вертикально-горизонтально   smile   воть  smile 

P.S. Щас попробую Restorе
PM MAIL   Вверх
mr.DUDA
Дата 1.8.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Вот пример где эллипс можно растягивать, крутить и двигать по форме:
Код
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        double _angle;
        Point _center;
        Size _size;

        public Form1()
        {
            InitializeComponent();

            _center = new Point(this.Width / 2, this.Height / 2);
            _size = new Size(this.Width / 4, this.Height / 8);
            _angle = 0;
        }

        private void form_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            // 400 отрезков прямых линий, чтобы нарисовать эллипс
            int nsteps = 400;
            double step_angle = 2 * Math.PI / (double)nsteps;
            double rot_sin = Math.Sin(_angle);
            double rot_cos = Math.Cos(_angle);
            double angle = 0;
            int x_prev = 0, y_prev = 0;

            // рисуем отрезки в цикле
            for (int i = 0; i < nsteps; i++, angle += step_angle)
            {
                double a_cos = _size.Width * Math.Cos(angle);
                double b_sin = _size.Height * Math.Sin(angle);

                double dx = a_cos * rot_cos - b_sin * rot_sin;
                double dy = b_sin * rot_cos + a_cos * rot_sin;

                int x = (int)(_center.X + dx), y = (int)(_center.Y + dy);
                if (i > 0) // начинаем с двух точек
                    g.DrawLine(Pens.Black, x_prev, y_prev, x, y);

                x_prev = x;
                y_prev = y;
            }
        }

        // предыдущее положение курсора мыши
        Point _prevLocation;

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            bool needRefresh = true;

            if ((e.Button & MouseButtons.Left) != 0)
            {
                // при нажатой левой кнопке мыши, двигаем центр эллипса
                _center = e.Location;
            }
            else if ((e.Button & MouseButtons.Right) != 0)
            {
                // при нажатой правой кнопке мыши, растягиваем эллипс
                _size.Width += e.Location.X - _prevLocation.X;
                _size.Height += e.Location.Y - _prevLocation.Y;
            }
            else if ((e.Button & MouseButtons.Middle) != 0)
            {
                // при нажатой средней кнопке мыши, поворачиваем эллипс
                _angle += (float)(e.Location.X - _prevLocation.X) / 10f;
            }
            else
                needRefresh = false; // если ни одна кнопка мыши не нажата - ничего не делаем

            _prevLocation = e.Location;

            if (needRefresh)
                this.Refresh();
        }
    }
}



--------------------
user posted image
PM MAIL WWW   Вверх
lioness
Дата 1.8.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 27.7.2006

Репутация: нет
Всего: нет



ПОЛУЧИЛОСЬ!!!  Уряяяя !    Правда, кривовато у меня эллипс переходит из квадрантов в квадрант по оси ОY, слегка смещение я чегой-то где-то подвираю. Но с геометрией сейчас мне недосуг. Как говорил, Василий Иванович, "да мне тоже не до сук, но вроде ... надА ..." 
Вобщем, бегают эллипсы по экрану, как хотелось пару дней назад  smile 
Код

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApp_ellipse_reversible
{
    /// <summary>
    /// Zusammenfassung für Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        /// <summary>
        /// Erforderliche Designervariable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        Boolean bHaveMouse = false;
        Graphics g;
        Pen pen, penClear;

        Point    ptOriginal = new Point();
        Point    ptLast = new Point();

        float angle, arg1, arg2;
        GraphicsState transState;

        private System.Windows.Forms.Label koordOrig;
        private System.Windows.Forms.Label currAngle;
        private System.Windows.Forms.Label koordCurr;

        public Form1()
        {
            //
            // Erforderlich für die Windows Form-Designerunterstützung
            //
            InitializeComponent();

            g = CreateGraphics();
            pen      = new Pen(SystemColors.ControlText);
            penClear = new Pen(SystemColors.Control);

            koordOrig.Text="";
            koordCurr.Text="";
            currAngle.Text="";

            //
            // TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
            //
        }

        /// <summary>
        /// Die verwendeten Ressourcen bereinigen.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Vom Windows Form-Designer generierter Code
        /// <summary>
        /// Erforderliche Methode für die Designerunterstützung. 
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        private void InitializeComponent()
        {
            this.koordOrig = new System.Windows.Forms.Label();
            this.koordCurr = new System.Windows.Forms.Label();
            this.currAngle = new System.Windows.Forms.Label();
            this.SuspendLayout();
            // 
            // koordOrig
            // 
            this.koordOrig.Location = new System.Drawing.Point(16, 8);
            this.koordOrig.Name = "koordOrig";
            this.koordOrig.TabIndex = 0;
            // 
            // koordCurr
            // 
            this.koordCurr.Location = new System.Drawing.Point(8, 40);
            this.koordCurr.Name = "koordCurr";
            this.koordCurr.Size = new System.Drawing.Size(152, 24);
            this.koordCurr.TabIndex = 1;
            // 
            // currAngle
            // 
            this.currAngle.Location = new System.Drawing.Point(8, 80);
            this.currAngle.Name = "currAngle";
            this.currAngle.Size = new System.Drawing.Size(136, 48);
            this.currAngle.TabIndex = 2;
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(720, 646);
            this.Controls.Add(this.currAngle);
            this.Controls.Add(this.koordCurr);
            this.Controls.Add(this.koordOrig);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new Form1());
        }

        protected override void OnLoad(System.EventArgs e)
        {
            MouseDown += new MouseEventHandler( MyMouseDown );
            MouseUp += new MouseEventHandler( MyMouseUp );
            MouseMove += new MouseEventHandler( MyMouseMove );
            bHaveMouse = false;
        }
        private void MyMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
                ptOriginal.X = e.X;
                ptOriginal.Y = e.Y;

                ptLast.X = -1;
                ptLast.Y = -1;
                bHaveMouse = true;

            koordOrig.Text = " Original x= " + ptOriginal.X + " y= " + ptOriginal.Y;
        }

        private void MyMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
        {

                Point ptCurrent = new Point( e.X, e.Y );
                g.Restore(transState);
                MyDrawReversibleEllipse( ptOriginal, ptLast, false);
                g.Restore(transState);
            
            ptLast.X = -1;
            ptLast.Y = -1;
            koordOrig.Text ="";
            currAngle.Text = "";
            bHaveMouse = false;

        }

        private void MyDrawReversibleEllipse(Point p1, Point p2, Boolean clear)
        {
            Rectangle rc = new Rectangle();
            float height;

            // Normalize the rectangle.
                if( p1.X < p2.X )
                    { rc.X = p1.X;    rc.Width = p2.X - p1.X;    }
                else
                    { rc.X = p2.X;    rc.Width = p1.X - p2.X;    }
            if( p1.Y < p2.Y )
                    {rc.Y = p1.Y;    rc.Height = p2.Y - p1.Y;}
                else {    rc.Y = p2.Y;    rc.Height = p1.Y - p2.Y; }

            if ((rc.Height==0)|| (rc.Width==0))  
            {
                if (!clear)  g.DrawLine (pen,p1,p2);
                       else  g.DrawLine(penClear, p1, p2);
                currAngle.Text = "LINE!!!!";
            }

            else 
            {

                    height = rc.Height;
                    rc.Height = (int) Math.Round(Math.Sqrt(rc.Height*rc.Height+rc.Width*rc.Width));
                    if (height < rc.Width) rc.Width = (int) height;

                    double  tmp = (p2.Y-p1.Y);
                    double tmp1 = (p2.X-p1.X);
                    tmp = tmp/tmp1;
                    tmp = Math.Atan(tmp);
                    tmp =  Math.Atan(tmp)*180/Math.PI;
                    angle = (float) Math.Round(tmp);
                arg1 =(float) Math.Round(height *Math.Sin(Math.PI * angle / 180.0));
                arg2 =(float) Math.Round(height*Math.Cos(Math.PI * angle / 180.0)-0.5*rc.Width);
                if (((rc.X==p1.X) && (rc.Y==p1.Y)) || ((rc.X==p2.X) && (rc.Y==p2.Y)))
                        {  arg1=0;  arg2=-arg2;  }

                if (!clear) 
                { 
                    currAngle.Text= angle.ToString();
                    currAngle.Text=currAngle.Text+" " + p1.X + " " + p1.Y + " " + p2.X + " " + p2.Y + " rc.X = " + rc.X + " rc.Y = " + rc.Y;
                    
                    transState = g.Save();
                    g.TranslateTransform(rc.X, rc.Y);
                    g.RotateTransform(angle); 
                    g.TranslateTransform(arg1,arg2);

                    g.DrawEllipse(pen, 0, 0, rc.Height, rc.Width); 
                }
                else 
                {

                    g.DrawEllipse(penClear, 0, 0, rc.Height, rc.Width);
                    g.Restore(transState);
                }
            }
        }

        private void MyMouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            Point ptCurrent = new Point( e.X, e.Y );

            koordCurr.Text = " current x= " + ptCurrent.X + " y= " + ptCurrent.Y;

            if( bHaveMouse )
            {
                if( ptLast.X != -1 )
                {
                    MyDrawReversibleEllipse( ptOriginal, ptLast, true );
                }
                // Update last point.
                ptLast = ptCurrent;
                // Draw new lines.
                MyDrawReversibleEllipse( ptOriginal, ptCurrent, false );
            }

        }

    }
}




 ТЕМА БЛАГОПОЛУЧНО ЗАКОНЧЕНАsmile

Если только кому-нибудь поупражняться еще захочется  smile  Код я оставляю. За основу было принято вот это: http://support.microsoft.com/default.aspx?...kb;en-us;314945

mr.DUDA Большое русское мерси !  В Ваш вариантик сейчас тоже вникну.
Потом еще чего-нибудь придумаю. Мне тут велено освоить за месяц.  smile  Вот я осваиваю ... вторую неделю ...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.2026 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.