Форум программистов, компьютерный форум CyberForum.ru

Растеризация кривой второго порядка - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Заполнить массив случайными числами по возрастанию и убыванию http://www.cyberforum.ru/cpp-beginners/thread168272.html
Случайными числами 0..700 по возрастанию и убыванию
C++ Написать программу, которая запрашивает у пользователя номер дня недели, затем выводит название дня недели Написать программу, которая запрашивает у пользователя номер дня недели, затем выводит название дня недели или сообщение об ошибке, если введены неправильные данные. http://www.cyberforum.ru/cpp-beginners/thread168261.html
Факториал C++
Помогите написать программу: Составить функцию, которая вычисляет сумму К слагаемых. В вызывающей функции main() организовать контроль ввода положительного целого K, большего 0. Через do... while или while или for -------------- В знаменателе 2n-1, а что делать со степенью x и меняющимися знаками??
C++ Определение колличества членов ak псоледовательности
Помогите пожалуйста подправить программу. Нужно Определить количество членов ak последовательности а1,....,аn, являющихся нечетными числами. #include <iostream> #include <conio.h> int S=0; int n; int main() { std::cout <<"vvedite n"; std::cin >>n; int a;
C++ Описать класс "Матрица" http://www.cyberforum.ru/cpp-beginners/thread168246.html
я как бэ в поиске нашел но мне бы хотелось узнать обязательно ли матрица должна быть динамической и можно написать метод для ввода и вывода матрицы? а то я пытался сделать но чего-то работает неверно...
C++ Перемножение двух чисел Никак не могу понять в чем ошибка в таком простом коде #pragma argsused #include <iostream.h> #include <conio.h> #include <math.h> #include <stdio.h> #include <clx.h> #pragma hdrstop подробнее

Показать сообщение отдельно
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
22.09.2010, 22:40     Растеризация кривой второго порядка
Ну тогда поясню на примере.
Дана кривая y = A*x^2 + B*x + C
Выразим её параметрически: x = t y = A*t^2 + B*t + C
Вектор касательной в точке t: N(t) = {x'(t); y'(t)} = {1; 2*A*t + B} (это обычные производные dx/dt и dy/dt, не совсем то, что в мат. анализе называется частными производными).
Перпендикулярный ему вектор получаем перестановкой компонент и сменой знака у одного из них (любого): P(t) = {2*A*t + B; -1}
Уравнение прямой, параллельной вектору V = {D; E} выглядит так: D*x + E*y + F = 0
Подставив P(t), получаем уравнение перпендикуляра к точке t:
(2*A*t + B) * x - y + F = 0, при этом мы пока не знаем F. Воспользуемся тем фактом, что перпендикуляр заведомо проходит через точку x(t), y(t):
(2*A*t + B) * t - (A*t^2 + B*t + C) + F = 0 -> A*t^2 - C + F = 0 -> F = C - A*t^2
Окончательное уравнение перпендикуляра: (2*A*t + B) * x - y + C - A*t^2 = 0
Теперь, если нам по данной точке {X; Y} надо найти ближайшую точку на кривой, необходимо решить это уравнение относительно t (то есть, выразить t через X и Y):
(2*A*t + B) * X - Y + C - A*t^2 = 0 -> A*t^2 - 2*A*t*X - B*X + Y - C = 0
t(X, Y) = (2*A*X +- sqrt(4*A^2*X^2-4*A*(Y - B*X - C)) ) / (4*A)
Исходя из здравого смысла, у этого уравнения всегда должен иметься хотя бы один корень. Хотя, я мог и что-то напутать в своих выкладках.
В общем случае мы имеем два корня и две точки: {x(t1); y(t1)} и {x(t2); y(t2)}, которые легко можем посчитать по тем параметрическим формулам, с которых начали. Нам остаётся посчитать два расстояния R1 = {x(t1); y(t1)} - {X; Y} и R2 = {x(t2); y(t2)} - {X; Y} и выбрать наименьшее.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru