2014 dxdy logo

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

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




 
 Генерирование точек решения неявного уравнения поверхности
Сообщение17.11.2014, 21:46 
Аватара пользователя
Доброго времени суток.
Собственно стоит задача построить цилинроид, код рендера и просчета точек писать самому. Дано неявное уравнение поверхности с параметром.
Делал так : сперва выделил куб в пространстве (т.е. задал промежуток изменения 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 
Аватара пользователя
AlekseiX86
Разбиение должно быть меньше чем допуск сравнения. Иначе точки могут просто не попадать на поверхность. Да и скорость метода маленькая.
Думаю лучше сменить метод рендера. С метода пристрелки, на сканирования линей (ScanLine), либо на трассировку лучей, либо на непосредственное построение в виде функции.

 
 
 [ Сообщений: 2 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group