2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Генерирование точек решения неявного уравнения поверхности
Сообщение17.11.2014, 21:46 
Аватара пользователя


06/05/14
10
Одесса
Доброго времени суток.
Собственно стоит задача построить цилинроид, код рендера и просчета точек писать самому. Дано неявное уравнение поверхности с параметром.
Делал так : сперва выделил куб в пространстве (т.е. задал промежуток изменения X,Y,Z), затем задал шаг разбиения h, согласно которому куб разбивается на точки. Затем подставляю координаты каждой точки через шаг в уравнение и проверяю равны ли правая и левая часть уравнения (брал модуль разности частей и сравнивал с погрешностью).
В чем вопрос к Вам : я хотел бы узнать в правильную ли сторону я двигаюсь, и нету ли странностей при тестах? Например, при увеличение размеров куба, кол-во точек увеличивается или очень мало, или вообще не увеличивается.

http://cs625116.vk.me/v625116292/b81a/P_F-nojQjeI.jpg
(картинка по размерам не влезла)

Уравнение поверхности  $(x^2+y^2+z^2)^3=a^3z(x^2-y^2)$

код: [ скачать ] [ спрятать ]
Используется синтаксис Javascript
        //fGet - получает число из textbox
        var points3D  = []; //массив точек на поверхности
        var checkEps = fGet("iT_Eps"); //погрешность при сравнении разности частей уравнения
        var parA       = fGet("iT_PA");
        var defX       = [fGet("iT_XS"),fGet("iT_XE")]; //размеры куба
        var defY       = [fGet("iT_YS"),fGet("iT_YE")];
        var defZ       = [fGet("iT_ZS"),fGet("iT_ZE")];
        var divStep  = fGet("iT_DS"); //шаг h

        //Округление до 6 знаков после запятой.
        function rP(x) {
            var m = Math.pow(10,6);
            return Math.round(x*m)/m;
        }

     //Проверяет произвольную точку R^3 на принадлежность поверхности
     function isInSurface(x,y,z){
         var leftPart  = Math.pow(x*x+y*y+z*z,3);
         var rightPart = Math.pow(parA,3)*z*(x*x-y*y);
         var sub = Math.abs(leftPart-rightPart);
         return (sub<=checkEps);
    }
   
    //Заполняет массив точек,принадлежащих поверхности
    function gen3DArray(){
            var SI       = 0; //индекс в points3D  
            var surfP   = 0; //кол-во точек на поверхности
            var nSurfP = 0; //общее кол-во поступивших точек
            for(var iX = defX[0]; iX <= defX[1]; iX=rP(iX+divStep)){
                for(var iY = defY[0]; iY <= defY[1]; iY=rP(iY+divStep)){
                    for(var iZ = defZ[0]; iZ <= defZ[1]; iZ=rP(iZ+divStep)){
                        if(isInSurface(rP(iX),rP(iY),rP(iZ))){
                            points3D[SI]=[rP(iX),rP(iY),rP(iZ)];
                            SI++;
                            surfP++;
                        }
                       nSurfP++;
                    }
                }
            }
        }
 

 Профиль  
                  
 
 Re: Генерирование точек решения неявного уравнения поверхности
Сообщение17.11.2014, 23:03 
Аватара пользователя


31/10/08
1244
AlekseiX86
Разбиение должно быть меньше чем допуск сравнения. Иначе точки могут просто не попадать на поверхность. Да и скорость метода маленькая.
Думаю лучше сменить метод рендера. С метода пристрелки, на сканирования линей (ScanLine), либо на трассировку лучей, либо на непосредственное построение в виде функции.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group