Ответы пользователя по тегу Математика
  • Математика внеземных цивилизаций?

    DmitryITWorksMakarov
    @DmitryITWorksMakarov
    Придерживаюсь в отношении математики принципов платонизма. То есть... идеи (эйдосы) существуют независимо от нашего существования. Скажем, идея квадрата, идея числа и т.д.
    Но мы в силу ограниченности наших органов чувств и нашего разума не знаем всех свойств этих эйдосов. То есть эйдосы, которыми мы манипулируем в науке, в математики - это лишь проекции настоящих эйдосов на наш разум.

    На существо устроенное по другому, мыслящее по другому настоящий эйдос проецируется тоже по другому. Таким образом, есть некоторая всеобщая математика, описывающая все закономерности. Есть наша частная математика, как часть всеобщей математики. И есть частная математика чужих. Частные математики могут пересекаться в каких-то частях, но, в общем, случае могут и не пересекаться.

    Приведу пример: какие-нибудь слепые разумные слизни с Альдебарана могут не знать про теорему Пифагора в силу отсутствия визуального мышления, но поскольку они общаются посредством постукиваний псевдоподиями (аналог азбуки Морзе), то вполне могут иметь представление об идее числа (2 стука, 3 стука+4 поглаживания). А если знаешь про число, то можешь что-то обобщить про него, выявить какие-то законы. А 2 стука да 2 стука будь ты хоть слизнем преклонных годов - все равно 4 стука.
    Ответ написан
  • Как понять комплексные числа?

    DmitryITWorksMakarov
    @DmitryITWorksMakarov
    Комплексные числа отличаются от обычного 2d-вектора. 2d-вектор - это просто упорядоченная пара действительных чисел. А комплексное число хоть и является 2d-вектором (в этом понимании), но для него заданы еще некоторые правила. Например, что вы можете сказать об умножении 2d-на себя (ну, то есть возведение в квадрат)? Практически ничего. Потому что, в общем, для него не определена эта операция (хотя никто не мешает доопределить, но это будет уже не совсем 2d-вектор). А вот для комплексного числа возведение в квадрат очень даже понятно что это.

    Если следовать вашей логике представления комплексного числа как структуры, то тут больше все же подойдет класс с переопределенными операциями: сложение и вычитание (это и для 2d-вектора аналогично), умножение, деление, степень, корень, логарифм......плюс надо не забыть про экспоненциальную форму (хотя с точки зрения 2d-вектора - это всего лишь длина и ориентация).

    P.S. Я читал про разных математиков, про то как они работают с математическими абстракциями. Есть те, которые фантазируют, представляют себе все это, а есть которые используют операционалисткий подход: "я не знаю что это, но я знаю как с этим работать". Первые открывают новые математические горизонты, а вторые ставят новые теории на прочные научные рельсы и пишут толстенные монографии. Понятное дело, что это крайности и обычно каждый математик как-то визуализирует себе то, с чем он занимается....
    Ответ написан
    Комментировать
  • Как реализовать масштабирование относительно произвольной точки?

    DmitryITWorksMakarov
    @DmitryITWorksMakarov Автор вопроса
    Сам нашел решение.

    Расписал аккуратно матрицы, вручную перемножил, получил готовую матрицу масштабирования относительно курсора, подставил в программу и все работает.

    Стал смотреть в чем дело у меня в программе.
    Оказалось: я неправильно понимал порядок перемножения матриц при применении метода Multiply(Matrix). К счастью у Multiply есть перегруженная версия с произвольным выбором порядка операндов.

    Должно быть так:

    public class DrawingAreaControl : UserControl
        {
            public DrawingAreaControl()
            {
                DoubleBuffered = true;
                transform = new Matrix();
            }
    
            public Matrix transform { get; set; }
        
            protected override void OnPaint(PaintEventArgs e)
            {
                e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    
                e.Graphics.Transform = transform;
    
                base.OnPaint(e);
            }
    
            const float SCALE_MUL = 1.05f;
            protected override void OnMouseWheel(MouseEventArgs e)
            {
                base.OnMouseWheel(e);
    
                var matrixOrder = MatrixOrder.Append;
                var K = e.Delta > 0 ? SCALE_MUL : 1 / SCALE_MUL;
                transform.Multiply(new Matrix(1, 0, 0, 1, -e.Location.X, -e.Location.Y), matrixOrder);
                transform.Multiply(new Matrix(K, 0, 0, K, 0, 0), matrixOrder);
                transform.Multiply(new Matrix(1, 0, 0, 1, e.Location.X, e.Location.Y), matrixOrder);
    
                Invalidate();
            }
        }


    Возможно, тот мой вариант с вручную подготовленной матрицей несколько эффективнее в вычислительном плане, но представленный вариант - читабельнее.
    Ответ написан
    Комментировать
  • 3 * 2 = 4 каким образом можно получить?

    DmitryITWorksMakarov
    @DmitryITWorksMakarov
    Вообще можно переопределить операцию умножения. Исторически так сложилось, что умножение это взять первого числа второе число раз. А мы с вами договоримся и никто нам не сможет помешать в этом, что при умножении нужно будет обязательно взять налог на операцию в размере трети от результата, тогда:

    3 * 2 = 4
    3 * 3 = 6
    6 * 6 = 24
    Ответ написан
    1 комментарий
  • Как увеличить высоту повернутого прямоугольника математически (быстрый алгоритм)?

    DmitryITWorksMakarov
    @DmitryITWorksMakarov
    При рисовании повернутых фигур можно применять афинные преобразования. Компьютер умеет это делать быстро.

    Например, при рисовании прямоугольника рисуем его неповернутым (стороны паралельны краям экрана), задаем матрицу преобразования (которая определяет смещение, поворот, масштабирование по X и по Y) и вот мы уже имеем нужный нам прямоугольник в нужном месте под нужным углом.

    При необходимости сжатия/растяжения можно тривиально сжать/растянуть исходный прямоугольник (неповернутый). Его матрица преобразования останется прежней и сместит/перевернет его в то место, где он был изначально, но уже сжатым/растяженным.

    Либо можно соответствующим образом модифицировать матрицу преобразования. Матрица преобразования определяет в том числе и растяжение/сжати по осям.

    В .NET в GDI+ есть готовые возможности для работы с афинными преобразованиями:
    Матричное представление преобразований
    Использование преобразований в управляемом GDI+

    P.S.:
    Если ваша задача - это лабораторная из цикла: сделал и забыл, то все это городить не имеет смысла.
    Но в больших проектах, где много графических элементов повернутых друг относительно друга иерархически связанных, лучше освоить математику афинных преобразований и перестроить в соответствии с ними архитектуру. Проще жить будет.
    Ответ написан
    2 комментария