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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2021, 20:40   #1
NeLirik
Пользователь
 
Регистрация: 09.11.2021
Сообщений: 11
По умолчанию Помогите найти ошибку алгоритма

Решил реализовать на C# программы из книги "Принципы программирования в машинной графике", автор Л. Аммерал, год издания 1992.

Программа правильно рисует 30 стрелок, но я решил "закрутить эти стрелки" и добавил таймер, по которому стрелки начинают вращаться каждый раз на 1 градус. При этом они вращаются неравномерно а с какими-то странными закономерностями.
Вот функция рисования стрелок.
Код:
 void Arrows_30() 
        {
            counter++;
          

            eXMax = pictureBox1.Width - 10;
            eYMax = pictureBox1.Height - 10;
            eYMin = 10;
            eXMin = 10;
             Axx = (eXMax - eXMin) / (xMax - xMin);
             Bxx = (eXMin - Axx * xMin);

             Ayy = (eYMin - eYMax) / (yMax - yMin); // Обрати внимание коэффициент другой БОЛЕЕ ТОЧНЫЙ
             Byy = eYMax - Ayy * yMin;    // Соответственно также и это коэффициент должен давать правильный результат

            Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics g = Graphics.FromImage(bmp);
            Pen pen = new Pen(Color.IndianRed, 1.0f);
        



        float[] x = { 0f, 0f, -0.7f, 0.7f }; //координаты Х  стрелки
            float[] y = { -0.7f, 0.7f, 0f, 0f }; //координаты Y стрелки
            float pi, phi, cos_phi, sin_phi, dx, dy;
            float x0 = 10.5f, y0 = 10.5f, r = 20.0f;
            pi = (float)(4f * Math.Atan(1.0));
            phi = 12 * pi / 180 + pi/360*counter;
            cos_phi = (float)Math.Cos(phi);
            sin_phi = (float)Math.Sin(phi);
            for(int j=0;j<=3;j++) //переносим стрелку в начальную точку с координатами (x0+r),y0
            {
                x[j] += x0 + r;
                y[j] += y0;
            }

            
            for (int i = 0; i < 30; i++) //рисуем 30 стрелок
               
            {
                if (i == 0) { pen.Color = Color.IndianRed; } else { pen.Color = Color.ForestGreen; }
                for (int j = 0; j < 4; j++) //поворот стрелки
                {
                    dx = x[j] - x0; dy = y[j] - y0;//так как было смещение на x0,y0, то для вычисления поворота отнимаем смещение
                    x[j] = x0 + dx * cos_phi - dy * sin_phi;// а здесь смещение x0  опять прибавили
                    y[j] = y0 + dx * sin_phi + dy * cos_phi;

                }
                
                g.DrawLine(pen, Axx * x[0] + Bxx, Ayy * y[0] + Byy, Axx * x[1] + Bxx, Ayy * y[1] + Byy);
                
                g.DrawLine(pen, Axx * x[1] + Bxx, Ayy * y[1] + Byy, Axx * x[2] + Bxx, Ayy * y[2] + Byy);
                g.DrawLine(pen, Axx * x[2] + Bxx, Ayy * y[2] + Byy, Axx * x[3] + Bxx, Ayy * y[3] + Byy);
                g.DrawLine(pen, Axx * x[1] + Bxx, Ayy * y[1] + Byy, Axx * x[3] + Bxx, Ayy * y[3] + Byy);
                //Рисуем стрелку на этот раз без цикла
                //Закончили рисовать стрелку

            }
            pen.Color = Color.ForestGreen;
            Font font1 = new Font("Arial", 20);
            SolidBrush brush1;
            brush1 = new SolidBrush(Color.Black);
            float x11 = 150.0F;
            float y11 = 50.0F;

            // Set format of string.
            StringFormat drawFormat = new StringFormat();
            drawFormat.FormatFlags = StringFormatFlags.DirectionVertical;

            g.DrawString(counter.ToString(), font1, brush1, x11, y11);

            g.Dispose();

            pictureBox1.Image = bmp;
        }
Думаю, может кому полезно будет,
Вот exe файл. Шестая кнопка круг из стрелок.
https://yadi.sk/d/iWOyLH8udanuFg
Посмотрите как крутятся стрелки и скажите, пожалуйста, почему нет равномерного вращения???
NeLirik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] найти сумму ряда , посчитать функцию ch(x) и найти абсолютную и относительную погрешности. Помогите найти ошибку! Vladonna Помощь студентам 2 13.09.2018 22:07
Помогите, пожалуйста, найти ошибку в коде (найти сумму факториалов чётных чисел в заданном диапазоне) kris14 Паскаль, Turbo Pascal, PascalABC.NET 8 25.10.2017 15:42
Дан массив а(n) типа SWORD. найти сумму всех отрицательных элементов массива.помогите найти ошибку Юлия123456 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 07.09.2016 06:12
Найти седловые точки в матрице(помогите найти ошибку) - pascal tdsotm Помощь студентам 0 20.11.2014 18:57
Помогите найти ошибку - StrToFloat выдаёт ошибку EConvertError для ячеек StringGrid (Delphi) Artsiom Помощь студентам 10 18.12.2013 14:10