 |
21.12.2009, 00:14
|
#1
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
помогите переписать код
код на бесике
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 напрягает)
|
(Offline)
|
|
21.12.2009, 00:37
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: помогите переписать код
...
if((IX&1)^(IY&1))
SY+=(SX/3);
else
SY+=((1-SX)/3);
IY=...
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.12.2009, 12:05
|
#3
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Ответ: помогите переписать код
а Int в бесике окруляет в какую сторону?
|
(Offline)
|
|
21.12.2009, 12:41
|
#4
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: помогите переписать код
в бейсике округляет в нижнюю Int(0.45) = 0
|
(Offline)
|
|
21.12.2009, 13:20
|
#5
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Ответ: помогите переписать код
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 чет оне помогает
|
(Offline)
|
|
21.12.2009, 13:35
|
#6
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Ответ: помогите переписать код
а все вопрос решен (int) заменил на modf
|
(Offline)
|
|
21.12.2009, 13:35
|
#7
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: помогите переписать код
Вообще, приведение к Int'у - это не округление, а отбрасывание дробной части. В с++ именно так работает приведение к инт'у.
Т.е.
Однако в блитце (во всех ли бейсиках так - не знаю) не так, в нём как раз округление.
Правило округления такое:
Если число чётное ТО
{
Если дробная часть числа <=(меньше или равна) 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
|
(Offline)
|
|
21.12.2009, 13:47
|
#8
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Ответ: помогите переписать код
Dim MyNumber As Integer MyNumber = Int(99.8) ' Returns 99. MyNumber = Int(-99.8) ' Returns -100. MyNumber = Int(-99.2) ' Returns -100.
вообще я тут почитал что бесик что C++ int делает тоже самое, хотя почемуто пример не пашет как надо
|
(Offline)
|
|
21.12.2009, 13:55
|
#9
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: помогите переписать код
Вообще-то, при работе с float очень желательно приводить входящие в выражение переменные и числа к флоату.
Например, вместо
писать
SX = (float)X * 2.0 / (float)ISO_WIDTH;
И так везде в коде. Попробуй заменить таким образом.
|
(Offline)
|
|
21.12.2009, 16:24
|
#10
|
ПроЭктировщик
Регистрация: 22.03.2009
Сообщений: 140
Написано 15 полезных сообщений (для 24 пользователей)
|
Ответ: помогите переписать код
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); }
положительные значения обрабатываются адекватно теперь, но отрицательные чуть чуть не совпадают
|
(Offline)
|
|
28.02.2010, 22:30
|
#11
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: помогите переписать код
Сообщение от Aceton
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 (округление в нижнюю сторону).
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:03.
|