forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Visual Basic (http://forum.boolean.name/forumdisplay.php?f=62)
-   -   помогите переписать код (http://forum.boolean.name/showthread.php?t=11528)

Aceton 21.12.2009 00:14

помогите переписать код
 
код на бесике
PHP код:

SX = X * 2 / cW 
    IX 
= Int(SX) 
    
SX = SX - IX 
    SY 
= Y * 4 / (cH * 3) 
    
IY = Int(SY) 
    If (
IX And 1) Xor (IY And 1) Then 
      SY 
= SY + SX / 3 
    
Else 
      
SY = SY + (1 - SX) / 3 
    End 
If 
    
IY = Int(SY) 
    
IX = Int((IX - IY) * 0.5) 

как он будет на С++? строка If (IX And 1) Xor (IY And 1) Then напрягает)

impersonalis 21.12.2009 00:37

Ответ: помогите переписать код
 
...
if((IX&1)^(IY&1))
SY+=(SX/3);
else
SY+=((1-SX)/3);

IY=...

Aceton 21.12.2009 12:05

Ответ: помогите переписать код
 
а Int в бесике окруляет в какую сторону?

H@NON 21.12.2009 12:41

Ответ: помогите переписать код
 
в бейсике округляет в нижнюю Int(0.45) = 0

Aceton 21.12.2009 13:20

Ответ: помогите переписать код
 
PHP код:

int X = (int)mx;
    
int Y = (int)my;
    
float SX,SY;
    
SX = X * 2 / ISO_WIDTH;
    
ISO_X = (int)SX;
    
SX = SX - ISO_X;
    
SY = Y * 4 / (ISO_HEIGHT * 3);
    
ISO_Y = (int)SY;
    if((
ISO_X&1)^(ISO_Y&1))
    {
        
SY+=(SX/3);
    }
    else
    {
        
SY+=((1-SX)/3);
    }
    
ISO_Y = (int)SY;
    
ISO_X = (int)((ISO_X - ISO_Y) * 0.5); 

сделать то сделал, но изза разного округления не выходит, +\-0.5 чет оне помогает

Aceton 21.12.2009 13:35

Ответ: помогите переписать код
 
а все вопрос решен (int) заменил на modf

Жека 21.12.2009 13:35

Ответ: помогите переписать код
 
Вообще, приведение к Int'у - это не округление, а отбрасывание дробной части. В с++ именно так работает приведение к инт'у.
Т.е.
Код:

(int)1.99999 = 1
Однако в блитце (во всех ли бейсиках так - не знаю) не так, в нём как раз округление.
Правило округления такое:
Код:

Если число чётное ТО
{
  Если дробная часть числа <=(меньше или равна) 0.5 то
    округляет в меньшую сторону
  Иначе
    округляется в большую сторону
}
Иначе
{
  Если дробная часть числа <(строго меньше) 0.5 то
    округляет в меньшую сторону
  Иначе
    округляется в большую сторону
}

из справки по блицу:
Код:

Int converts floating point numbers by rounding to the nearest integer.
NOTE: This is not the traditional meaning of Int in Basic.

What about numbers exactly halfway between integers?
The rounding is to the nearest even integer:

Int( 2.5 ) ... produces 2
Int( 3.5 ) ... produces 4


Aceton 21.12.2009 13:47

Ответ: помогите переписать код
 
PHP код:

Dim MyNumber As Integer
MyNumber 
= Int(99.8)   ' Returns 99.
MyNumber = Int(-99.8)  ' 
Returns -100.
MyNumber 
= Int(-99.2)  ' Returns -100. 

вообще я тут почитал что бесик что C++ int делает тоже самое, хотя почемуто пример не пашет как надо

Жека 21.12.2009 13:55

Ответ: помогите переписать код
 
Вообще-то, при работе с float очень желательно приводить входящие в выражение переменные и числа к флоату.
Например, вместо
Код:

SX = X * 2 / ISO_WIDTH;
писать
Код:

SX = (float)X * 2.0 / (float)ISO_WIDTH;
И так везде в коде. Попробуй заменить таким образом.

Aceton 21.12.2009 16:24

Ответ: помогите переписать код
 
PHP код:

float X,Y;
    
X = mx; 
    
Y = my; 
    
SX = X * 2.0 / ISO_WIDTH; 
    
modf(SX,&ISO_X); 
    
SX = SX - ISO_X; 
    
SY = Y * 4.0 / (ISO_HEIGHT * 3.0); 
    
modf(SX,&ISO_Y);
    if(((int)
ISO_X&1)^((int)ISO_Y&1)) 
    { 
        
SY+=(SX/3.0); 
    } 
    else 
    { 
        
SY+=((1.0-SX)/3.0); 
    } 
    
modf(SY,&ISO_Y);
    
    if((
ISO_X - ISO_Y) * 0.5<0.0)
    {
        
modf((ISO_X - ISO_Y) * 0.5-1.0,&ISO_X);
    }
    else
    {
        
modf((ISO_X - ISO_Y) * 0.5,&ISO_X);
    } 

положительные значения обрабатываются адекватно теперь, но отрицательные чуть чуть не совпадают

pax 28.02.2010 22:30

Ответ: помогите переписать код
 
Цитата:

Сообщение от Aceton (Сообщение 130420)
PHP код:

Dim MyNumber As Integer
MyNumber 
= Int(99.8)   ' Returns 99.
MyNumber = Int(-99.8)  ' 
Returns -100.
MyNumber 
= Int(-99.2)  ' Returns -100. 

вообще я тут почитал что бесик что C++ int делает тоже самое, хотя почемуто пример не пашет как надо

Не ругайте за некрофилию, тут похоже нужно использовать функцию floor (округление в нижнюю сторону).


Часовой пояс GMT +4, время: 16:56.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot