Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: j2me and math  (Прочитано 14178 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Mfcer__
Команда клуба

ru
Offline Offline

« : 27-08-2004 22:10 » 

Добрый день!

Хотел бы узнать как из j2me вызывать математические функции, например sin, cos и прочее?
Записан
Serega
Гость
« Ответ #1 : 28-08-2004 06:33 » 

В CLDC 1.1 в math есть sin, cos и т.д., в 1.0 нету, так же нет и float
Если под 1.0 пишешь то смотри в SDK производителя, может у них реализован float
если же хочешь переносимую программку, тогда придется реализовывать фиксед арифметику
а таблицу синусов/косинусов можно посчитать на компе и сохранить в ресурсах, она не большая получается, достаточно одной четверти sin или cos
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #2 : 28-08-2004 21:10 » 

Можете привести примеры?...

а есть ли уже готовые сторонних разработчиков функции ?
Записан
Serega
Гость
« Ответ #3 : 29-08-2004 16:22 » 

Можно использовать что-то подобное
Код:
public class Fixed implements Comparable
{
    private static int divisor = 10000;
    private static int divisor_sqrt = 100;

    private Integer value;

    public Fixed(int value)
    {
        this.value = new Integer(value * divisor);
    }

    public Fixed(int value, boolean isFixed)
    {
        this.value = new Integer(isFixed ? value : value * divisor);
    }

    public Fixed add(Fixed right)
    {
        return new Fixed(getValue() + right.getValue());
    }

    public Fixed sub(Fixed right)
    {
        return new Fixed(getValue() - right.getValue());
    }

    public Fixed mul(Fixed right)
    {
        int a = getValue() / divisor_sqrt;
        int a1 = getValue() % divisor_sqrt;
        int b = right.getValue() / divisor_sqrt;
        int b1 = right.getValue() % divisor_sqrt;
        return new Fixed( a*b + (a1*b + a*b1)/divisor_sqrt + (a1*b1)/divisor );
    }

    public Fixed div(Fixed right)
    {
        return new Fixed((getValue() * divisor) / right.getValue());
    }

    public Fixed neg()
    {
        return new Fixed( -getValue(), true );
    }

    public int getValue()
    {
        return value.intValue();
    }

    static public int getDivisor()
    {
        return divisor;
    }

    public int getAiming()
    {
        return getValue() / divisor;
    }

    public int hashCode()
    {
        return value.hashCode();
    }

    public boolean equals(Object obj)
    {
        return value.equals(((Fixed)obj).value);
    }

    public int compareTo(Object obj)
    {
        return value.compareTo(((Fixed)obj).value);
    }
}
Умножение так сделано чтобы хоть как-то защититься от переполнения, подробно это описано здесь
« Последнее редактирование: 30-11-2007 23:41 от Алексей1153++ » Записан
Serega
Гость
« Ответ #4 : 29-08-2004 17:49 » 

Косинус и синус можно сделать так
Код:
public class FixedMath
{
    static Fixed zero = new Fixed(0);
    static Fixed angle0 = new Fixed(0);
    static Fixed angle90 = new Fixed(90);
    static Fixed angle180 = new Fixed(180);
    static Fixed angle270 = new Fixed(270);
    static Fixed angle360 = new Fixed(360);

    static Fixed[] cosValues;

    static
    {
        //читаем из файла сохраненные значения для cos 0 - 90
    }

    public static Fixed cos(Fixed angle)
    {
        angle = correctAngle(angle);

        if( angle.compareTo(angle270) > 0 )
        {
            return findValue(angle360.sub(angle));
        }
        if( angle.compareTo(angle180) > 0 )
        {
            return findValue(angle.sub(angle180)).neg();
        }
        if( angle.compareTo(angle90) > 0 )
        {
            return findValue(angle180.sub(angle)).neg();
        }
        return findValue(angle);
    }

    public static Fixed sin(Fixed angle)
    {
        return cos( angle.sub(angle90) );
    }

    static Fixed correctAngle(Fixed angle)
    {
        while( angle.compareTo(angle0) < 0 )
        {
            angle = angle.add(angle360);
        }
        while( angle.compareTo(angle360) > 0 )
        {
            angle = angle.sub(angle360);
        }
        return angle;
    }

    static Fixed findValue(Fixed angle)
    {
        Fixed step = angle90.div(new Fixed(cosValues.length));
        Fixed current = step;
        for(int i = 0; i < cosValues.length; ++i)
        {
            if( angle.compareTo(current) < 0 ) return cosValues[i];
            current = current.add(step);
        }
        return zero;
    }
}
90 - 180: cos(x) = -cos(180 - x)
180 - 270: cos(x) = -cos(x - 180)
270-360: cos(x) = cos(360 - x)

sin(x) = cos(x - 90)

Углы в градусах, если нужно сделать в радианах, нужно только изменить константы angleXXX
« Последнее редактирование: 30-11-2007 23:42 от Алексей1153++ » Записан
Serega
Гость
« Ответ #5 : 29-08-2004 17:57 » new

Осталось только создать табличку косинусов
Код:
public class CosGenerator
{
    static public Fixed[] generate(int amount)
    {
        Fixed[] result = new Fixed[amount];
        double step = Math.PI / 2 / amount;
        double current = 0;
        for(int i = 0; i < amount; ++i)
        {
            result[i] = toFixed(Math.cos(current));
            current += step;
        }
        return result;
    }

    static Fixed toFixed(double f)
    {
        return new Fixed((int)(f * Fixed.getDivisor()), true);
    }
}
« Последнее редактирование: 30-11-2007 23:43 от Алексей1153++ » Записан
Serega
Гость
« Ответ #6 : 29-08-2004 18:43 » 

На правах флуда:
Mfcer__, а че это ты в Питере а на пивных сборах тебя не видно ?
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #7 : 29-08-2004 21:36 » 

Serega, а где они проводятся? С удвольствием посещу и поучаствую  Отлично
Записан
Serega
Гость
« Ответ #8 : 30-08-2004 06:02 » 

На днях собираемся, пиши в аську, мой номер 177953614
В нашем полку прибыло ! Ага
Записан
Serega
Гость
« Ответ #9 : 30-08-2004 09:24 » 

Собираемся во вторник, выходи на связь, договоримся где встречаемся
Записан
Serega
Гость
« Ответ #10 : 30-08-2004 10:45 » 

Встречаемся в 19-00 на выходе Чернышевской, сообщи что придешь :!:
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines