CRC32校驗

CRC32校驗
CRC32校驗

『CRC32』同『MD5』『SHA1』壹樣,計『貳进制』數值『指紋』,佢速度快,HASH校验值肆字節.两DWORD值相等比較. 适宜網络數據傳輸, 校驗數據係咪完璧.

DWORD CRC32_Table[256] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
};

DWORD CRC32(PBYTE buf, int len){
int i;
DWORD crc;

crc = 0xffffffffL;
for (i = 0; i < len; ++i )
crc = CRC32_Table[(crc ^ buf[i]) & 0xff] ^ (crc >> 8);

crc = crc ^ 0xffffffffL;
return crc;
}

 

色鑑-丹色

色鑑-丹色
色鑑-丹色

『丹』主成份係水銀同硫磺天然礦物.愛蒞整顏料同入藥. 所以『丹色』含有劇毒性.色近紅土色, 比『朱色』偏紅.

紅亦即火屬,驅魔消厄.神社神宫神殿木制建築皆塗『丹色』, 呌『丹塗』.

木表層『丹塗』可防蟲蛀.

『丹色』取自天然礦石『鉛丹』, 又呌『光明丹』.

丹色 光明丹
源料 鉛丹
英文 Cinnabar
RGB  
RGB  
CMYK C=0 M=59 Y=78 K=11

C=0 M=68 Y=80 K=20

用途 天然紅色顏料

 

色鑑-綠青

色鑑-綠青
色鑑-綠青

『綠青』源自『孔雀石』,天然綠色顏料.作為傳統綠色顏料,愛蒞畫草草木木.

將天然『孔雀石』敲碎磨粉.又呌『岩綠青』/『松葉綠青』.

神殿屋頂採用綠青色銅瓦.

青銅佛像長期好天曬落雨淋. 青銅氧化生鏽. 此視像亦呌『綠青』.

綠青 岩綠青/松葉綠青
  孔雀石/ Malachite
英文  
RGB R=108 g=160 b=129

R=76 g=142 b=112

RGB 0x6ca081

0x4c8e70

CMYK C=62 M=23 Y=55 K=0

C=70 M=25 Y=60 K=10

用途 天然綠色顏料

 

年號

年號
年號

年號愛蒞紀年,『天皇更替』『天災人禍』之時更改年號.

飛鳥時代-年號/元號 儒略曆 天皇
大化 645年6月 孝德天皇
白雉 650年2月
朱鳥 686年7月 天武天皇
大寶 701年3月 文武天皇
慶雲 704年5月
和銅 708年正月 元明天皇

 

奈良時代-年號 儒略曆  
靈龜 715年九月 元正天皇
養老 717年十一月
神龜 724年二月 聖武天皇
天平 729年八月
天平感寶 749年四月
天平勝寶 749年七月 孝謙天皇
天平寶字 757年八月
天平神護 765年正月 稱德天皇
神護景雲 767年八月
寶龜 770年十月 光仁天皇
天應 781年四月
延曆 782年八月 桓武天皇

 

平安時代-年號 儒略曆 天皇
大同 806年五月 平城天皇
弘仁 810年九月 嵯峨天皇
天長 824年正月 淳和天皇
承和 834年正月 仁明天皇
嘉祥 848年六月
仁壽 851年四月 文德天皇
齊衡 854年十一月
天安 857年二月
貞觀 859年四月 清和天皇
元慶 877年四月 陽成天皇
仁和 885年二月 光孝天皇
寬平 889年四月 宇多天皇
昌泰 898年四月 醍醐天皇
延喜 901年七月
延長 923年閏四月
承平 931年四月 朱雀天皇
天慶 938年五月
天曆 947年四月 村上天皇
天德 957年十月
應和 961年二月
康保 964年七月
安和 968年八月 冷泉天皇
天祿 970年三月 圓融天皇
天延 973年十二月
貞元 976年七月
天元 978年十一月
永觀 983年四月
寬和 985年四月 花山天皇
永延 987年四月 一條天皇
永祚 989年八月
正曆 990年十一月
長德 995年二月
長保 999年正月
寬弘 1004年七月
長和 1012年十二月 三條天皇
寬仁 1017年四月 後一條天皇
治安 1021年二月
萬壽 1024年七月
長元 1028年七月
長曆 1037年四月 後朱雀天皇
長久 1040年十一月
寬德 1044年十一月
永承 1046年四月 後冷泉天皇
天喜 1053年正月
康平 1058年八月
治曆 1065年八月
延久 1069年四月 後三條天皇
承保 1074年八月 白河天皇
承曆 1077年十一月
永保 1081年二月
應德 1084年二月
寬治 1087年四月 堀河天皇
嘉保 1094年十二月
永長 1096年十二月
承德 1097年十一月
康和 1099年八月
長治 1104年二月
嘉承 1106年四月
天仁 1108年八月 鳥羽天皇
天永 1110年七月
永久 1113年七月
元永 1118年四月
保安 1120年四月
天治 1124年四月 崇德天皇
大治 1126年正月
天承 1131年正月
長承 1132年八月
保延 1135年四月
永治 1141年七月
康治 1142年四月 近衛天皇
天養 1144年二月
久安 1145年七月
仁平 1151年正月
久壽 1154年十月
保元 1156年四月 後白河天皇
平治 1159年四月 二條天皇
永曆 1160年正月
應保 1161年九月
長寬 1163年三月
永萬 1165年六月
仁安 1166年八月 六條天皇
嘉應 1169年四月 高倉天皇
承安 1171年四月
安元 1175年七月
治承 1177年八月
養和 1181年七月 安德天皇
壽永 1182年五月
元曆 1184年四月 後鳥羽天皇

 

鎌倉時代-年號 儒略曆 天皇
文治 1185年八月 後鳥羽天皇
建久 1190年四月
正治 1199年四月 土御門天皇
建仁 1201年二月
元久 1204年二月
建永 1206年四月
承元 1207年十月
建曆 1211年三月 順德天皇
建保 1213年十二月
承久 1219年四月
貞應 1222年四月 後堀河天皇
元仁 1224年十一月
嘉祿 1225年四月
安貞 1227年十二月
寬喜 1229年三月
貞永 1232年四月
天福 1233年四月 四條天皇
文曆 1234年十一月
嘉禎 1235年九月
曆仁 1238年十一月
延應 1239年二月
仁治 1240年七月
寬元 1243年二月 後嵯峨天皇
寶治 1247年二月 後深草天皇
建長 1249年三月
康元 1256年十月
正嘉 1257年三月
正元 1259年三月
文應 1260年四月 龜山天皇
弘長 1261年二月
文永 1264年二月
建治 1275年四月 後宇多天皇
弘安 1278年二月
正應 1288年四月 伏見天皇
永仁 1293年八月
正安 1299年四月 後伏見天皇
乾元 1302年十一月 後二條天皇
嘉元 1303年八月
德治 1306年十二月
延慶 1308年十月 花園天皇
應長 1311年四月
正和 1312年三月
文保 1317年二月
元應 1319年四月 後醍醐天皇
元亨 1321年二月
正中 1324年十二月
嘉曆 1326年四月
元德 1329年八月
元弘 1331年八月

 

室町時代-建武新政年號 儒略曆 天皇
建武 1334年正月 後醍醐天皇

 

室町時代-南朝年號 儒略曆 天皇
延元 1336年二月 後醍醐天皇
興國 1340年四月 後村上天皇
正平 1346年四月
建德 1370年十二月 長慶天皇
文中 1372年三月
天授 1375年五月
弘和 1381年二月
元中 1384年四月 後龜山天皇

 

室町時代-北朝年號 儒略曆 天皇
建武 1336年二月 光明天皇
曆應 1338年八月
康永 1342年四月
貞和 1345年十月
觀應 1350年二月 崇光天皇
文和 1352年九月 後光嚴天皇
延文 1356年三月
康安 1361年三月
貞治 1362年九月
應安 1368年二月
永和 1375年二月 後圓融天皇
康曆 1379年三月
永德 1381年二月
至德 1384年二月 後小松天皇
嘉慶 1387年八月
康應 1389年二月
明德 1390年三月

 

室町時代-明德統一年號 儒略曆 天皇
應永 1394年七月 後小松天皇
正長 1428年四月 稱光天皇
永享 1429年九月 後花園天皇
嘉吉 1441年二月
文安 1444年二月
寶德 1449年七月
享德 1452年七月
康正 1455年七月
長祿 1457年九月
寬正 1460年十二月
文正 1466年二月 後土御門天皇
應仁 1467年三月
文明 1469年四月
長享 1487年七月
延德 1489年八月
明應 1492年七月
文龜 1501年二月 後柏原天皇
永正 1504年二月
大永 1521年八月
享祿 1528年八月 後奈良天皇
天文 1532年七月
弘治 1555年十月
永祿 1558年二月 正親町天皇

 

安土桃山時代-年號 儒略曆 天皇
元龜 1570年四月 正親町天皇
天正 1573年七月
文祿 1592年十二月 後陽成天皇
慶長 1596年十月

 

江戶時代-年號 儒略曆 天皇
元和 1615年七月 後水尾天皇
寬永 1624年二月
正保 1644年十二月 後光明天皇
慶安 1648年二月
承應 1652年九月
明曆 1655年四月 後西天皇
萬治 1658年七月
寬文 1661年四月
延寶 1673年九月 靈元天皇
天和 1681年九月
貞享 1684年二月
元祿 1688年九月 東山天皇
寶永 1704年三月
正德 1711年四月 中御門天皇
享保 1716年六月
元文 1736年四月 櫻町天皇
寬保 1741年二月
延享 1744年二月
寬延 1748年七月 桃園天皇
寶曆 1751年十月
明和 1764年六月 後櫻町天皇
安永 1772年十一月 後桃園天皇
天明 1781年四月 光格天皇
寬政 1789年正月
享和 1801年二月
文化 1804年二月
文政 1818年四月 仁孝天皇
天保 1830年十二月
弘化 1844年十二月
嘉永 1848年二月 孝明天皇
安政 1854年十一月
萬延 1860年三月
文久 1861年二月
元治 1864年二月
慶應 1865年四月

 

一世一元-年號 儒略曆 天皇
明治 1868年舊曆9月 明治天皇
大正 1912年7月 大正天皇
昭和 1926年12月 昭和天皇
平成 1989年1月 明仁天皇
令和 2019年5月 德仁天皇

 

禮拜行星

禮拜 行星 希臘神祇
禮拜日SUNDAY 日曜日 太陽神
禮拜壹MONDAY 月曜日 月光女神
禮拜貳TUESDAY 火曜日 戰神
禮拜三WEDNESDAY 水曜日 神使
禮拜肆THURSDAY 木曜日 天神
禮拜伍FRIDAY 金曜日 愛神
禮拜陸SATURDAY 土曜日 農神

 

馬騮分桃

馬騮分桃
馬騮分桃

『甲』『乙』『丙』『丁』『戊』馬騮相約摘桃,日落斟酌後,聽朝再蒞分桃.

入夜『甲』『乙』『丙』『丁』『戊』馬騮相繼前後腳翻蒞, 『分桃伍份』,多出『壹個桃』喫咗落肚, 後拎走『壹份桃』.

問『甲』『乙』『丙』『丁』『戊』伍馬騮至小摘幾多桃?

問『戊』馬騮走後,仲剩幾多桃?

 

此題出自英國物理學家『保羅·狄拉克』. 系電腦時代,變得喫生菜咁喫.

『分桃伍份』,多出『壹個桃』喫咗落肚, 後拎走『壹份桃』.

即『x = x – 1 – (x / 5)』

 

bool test(int x)

{

// 多出『壹個桃』吃咗落肚, 後拎走『壹份桃』.

if ((x % 5) != 1)// 『甲』

return false;

x = x – 1 – (x / 5);

 

if ((x % 5) != 1)// 『乙』

return false;

x = x – 1 – (x / 5);

 

if ((x % 5) != 1)// 『丙』

return false;

x = x – 1 – (x / 5);

 

if ((x % 5) != 1)// 『丁』

return false;

x = x – 1 – (x / 5);

 

if ((x % 5) != 1)//『戊』

return false;

return true;

}

自1開始,暴力測試.

    for (x = 1; ; ++x)  {

if (test(x) == true) {

printf(“桃總量=%i\r\n”, x);

break;

}

}

 

問『戊』馬騮走後, 仲剩幾多桃 ?

int caleX5 (int x){

// 多出『壹個桃』喫咗落肚, 後拎走『壹份桃』.

x = x – 1 – (x / 5);

x = x – 1 – (x / 5);

x = x – 1 – (x / 5);

x = x – 1 – (x / 5);

x = x – 1 – (x / 5);

return x;

}

 

遊戲輵-角度比效

遊戲輵-角度比效
遊戲輵-角度比效

首先角度格式為『0<= A <360』

小於0

while(angle < 0.0f)

angle = angle + 360.0f;

大於等於360

while(angle >= 360.0f)

angle = angle – 360.0f;

事因正圓分360份,即360度.360度即係0度.

當夾角誇越0度, 即BEGIN > END, 要延展角度. 即加360度.

bool Compute_Angle_In_RAC(float angle,float begin,float end){
float    _angle = Format_Angle(angle);//格式角

float    _begin = Format_Angle(begin);//格式角

float    _end  = Format_Angle(end);//格式角

    if(_begin > _end){

_end   = _end + 360;

if(_angle > 0 && _angle < end )

_angle = _angle + 360;

}

    if( _angle >= _begin && _angle <= _end )// 夾角落㸃

return true;

return false;

}

 

 

紋理拼圖

紋理拼圖
紋理拼圖

2D游戲動画幀, 由多幅關鍵幀(keyFrame) 組成. 逐幀渲染產生動画卡通.『幀動画』亦哎呌『紋理』texture. 将多幅『幀動画』存放係單壹紋理.OpenGL可提高渲染速度, 係显存記憶體1MB年代可能冇用. 事因渲染皆係電脑記憶體運作.

係显存記憶體大幅增長, OpenGL渲染係显存記憶體完成. 减小『紋理』載入量, 單壹紋理存放多幅『幀動画』,可提高渲染速度.

係3D游戲亦可用相同技術提飛渲染效率.

void zoom_textcoord_model3D(TEXTURE_PTR texture,int index,int size,VECTOR2D_PTR dest,VECTOR2D_PTR sour,int count,int flag)

 

texture 紋理
index 關鍵幀索引
size 關鍵幀寬高解像
dest 纹理隊列
sour 原始纹理隊列
count 纹理頂點量

計單元格

int cell = texture->width / size;

計索引

int  i  = index % cell;// 橫索引
int  j  = index / cell;// 行索引

計缩放率0.0f < zoom < 1.0f

float    zoom    = (float)size / (float)texture->width;

計『幀』偏移.

float offsetX = (float)zoom * (float)i;
float offsetY = (float)zoom * (float)j;

遍歴UV紋理頂㸃

    for (int p = 0; p < count; ++p){

缩細後移動

dest[p].u = sour[p].u * zoom + offsetX ;
dest[p].v = sour[p].v * zoom + offsetY;

纹理返转

if (flag & MODEL3D_TEXTURE_FLIP)

dest[p].v = 1 – (sour[p].v * zoom + offsetY);}

 

SKYBOX天幕

天幕SKYBOX
天幕SKYBOX
天幕SKYBOX
天幕SKYBOX

『天幕SKYBOX』指巨立方體, 係內籠貼天幕紋理,『天幕紋理』可能係『地平線』『室內』『宇宙』. 『天幕SKYBOX』原㸃與3D相機位置重合. 係遠睇時正确.

由陸幅紋理『顶』『底』『前』『後』『左』『右』組成. 以前『天幕SKYBOX』紋理分陸幅位圖存檔.

陸幅位圖存係單壹『紋理』效率更高. 将『紋理』平分拾陸等分. 足够擺两組『天幕』紋理. 『日頭』『晚黑』各壹. 似上圖咁.

紋理索引:0~15 『日頭』 『晚黑』
顶up 0 8
底dn 1 9
前ft 7 15
后bk 5 13
左lt 6 14
右rt 4 12

定義『天幕SKYBOX』

typedef struct SKYBOX_TYP {
VECTOR3D  pos; 位置
VECTOR3D  rot; 旋轉
TEXTURE_PTR texture; 天幕纹理
float     size; 天幕大细
//TEXTURE_REGION region[16]; 纹理区域
VECTOR3D  vertex_array[36]   ; 天幕顶点
VECTOR2D  texCoord_array[36] ; 天幕紋理
}SKYBOX, *SKYBOX_PTR;

手エ构建『天幕SKYBOX』立方體『3D頂㸃』同『UV紋理』. 正方形以两三角形組成. 紋理左上角[u0, v0], 紋理右下角[u1,v1].天幕大细『size』.

天『UV紋理』 『xyz頂㸃』
texCoord[0]=[u1, v1] vertex_array[0]=[-size, size, -size]
texCoord[1]=[u0, v1] vertex_array[1]=[size, size, -size]
texCoord[2]=[u0, v0] vertex_array[2]=[size, size, size]
texCoord[3]=[u1, v1] vertex_array[3]=[-size, size, -size]
texCoord[4]=[u0, v0] vertex_array[4]=[size, size, size]
texCoord[5]=[u1, v0] vertex_array[5]=[-size, size, size]

 

地『UV紋理』 『xyz頂㸃』
texCoord[6]=[u1, v1] vertex_array[6]=[size, -size, -size]
texCoord[7]=[u0, v1] vertex_array[7]=[-size, -size, -size]
texCoord[8]=[u0, v0] vertex_array[8]=[-size, -size, size]
texCoord[9]=[u1, v1] vertex_array[9]=[size, -size, -size]
texCoord[10]=[u0, v0] vertex_array[10]=[-size, -size, size]
texCoord[11]=[u1, v0] vertex_array[11]=[size, -size, size]

 

前『UV紋理』 『xyz頂㸃』
texCoord[12]=[u0, v0] vertex_array[12]=[-size, -size, -size]
texCoord[13]=[u1, v0] vertex_array[13]=[size, -size, -size]
texCoord[14]=[u1, v1] vertex_array[14]=[size, size, -size]
texCoord[15]=[u0, v0] vertex_array[15]=[-size, -size, -size]
texCoord[16]=[u1, v1] vertex_array[16]=[size, size, -size]
texCoord[17]=[u0, v1] vertex_array[17]=[-size, size, -size]

 

后『UV紋理』 『xyz頂㸃』
texCoord[18]=[u0, v0] vertex_array[18]=[size, -size, size]
texCoord[19]=[u1, v0] vertex_array[19]=[-size, -size, size]
texCoord[20]=[u1, v1] vertex_array[20]=[-size, size, size]
texCoord[21]=[u0, v0] vertex_array[21]=[size, -size, size]
texCoord[22]=[u1, v1] vertex_array[22]=[-size, size, size]
texCoord[23]=[u0, v1] vertex_array[23]=[size, size, size]

 

右『UV紋理』 『xyz頂㸃』
texCoord[24]=[u1, v0] vertex_array[24]=[size, -size, size]
texCoord[25]=[u1, v1] vertex_array[25]=[size, size, size]
texCoord[26]=[u0, v1] vertex_array[26]=[size, size, -size]
texCoord[27]=[u1, v0] vertex_array[27]=[size, -size, size]
texCoord[28]=[u0, v1] vertex_array[28]=[size, size, -size]
texCoord[29]=[u0, v0] vertex_array[29]=[size, -size, -size]

 

左『UV紋理』 『xyz頂㸃』
texCoord[30]=[u1, v0] vertex_array[30]=[-size, -size, -size]
texCoord[31]=[u1, v1] vertex_array[31]=[-size, size, -size]
texCoord[32]=[u0, v1] vertex_array[32]=[-size, size, size]
texCoord[33]=[u1, v0] vertex_array[33]=[-size, -size, -size]
texCoord[34]=[u0, v1] vertex_array[34]=[-size, size, size]
texCoord[35]=[u0, v0] vertex_array[35]=[-size, -size, size]

 

Android两指縮放

Android两指縮放
Android两指縮放

之前做Android 游戲皆单㸃触摸, 諗住係風水羅盤實現两指縮放.

触摸分叁動作『鬆』『撳』『拖』.

動作 注释
#define TOUCH_UP      1
#define TOUCH_DOWN    2
#define TOUCH_DRAGGED 3

雙手拾指, 除非用埋脚指

#define MAX_FINGER    10 拾指

定義TOUCH結构, 用蒞存拾指『方位』同『動作』

TOUCH結构 注释
typedef struct TOUCH_STR{
    int count; 手指量, 最多10指
    int action[MAX_FINGER]; 動作
    int x[MAX_FINGER]; X座標
    int y[MAX_FINGER]; Y座標
}TOUCH,*TOUCH_PTR;

用栈stack蒞存触摸,

#define MAX_TOUCH     32 棧高32
TOUCH touch_array[MAX_TOUCH] ; 触摸棧
int   touch_count; 棧頂

棧頂加壹, 每次存触摸『方位』同『動作』前調用

int Add_Touch(){

TOUCH_PTR touch;

int index;

if(touch_count >= MAX_TOUCH)

return touch_count;

index = touch_count;

++touch_count;// 棧頂加壹

touch = &touch_array[index];

touch->count = 0;

return touch_count;

}

棧頂减壹, 讀『方位』同『動作』後調用

int Sub_Touch(){

if(touch_count <= 0)

return touch_count;

–touch_count;

return touch_count;

}

存触摸『方位』同『動作』, finger係手指索引

bool Set_Touch(int finger,int action,float x,float y){

int index;

TOUCH_PTR touch;

index = touch_count-1; // 棧頂

touch = &touch_array[index];

if(touch->count < finger + 1)

touch->count = finger + 1;

touch->action[finger] = action;

touch->x[finger] = x ;

touch->y[finger] = y ;

return true;

}

讀触摸, 『方位』同『動作』, finger係手指索引

bool Get_Touch(int finger,int * action,int * x,int * y){

TOUCH_PTR  touch;

int index;

if(touch_count == 0)

return false;

index = touch_count – 1;

touch = &touch_array[index];

*action = touch->action[finger];

*x = touch->x[finger];

*y = touch->y[finger];

return true;

}

計两指(x0,y0)(x1,y1)縮放時中心位(cx,cy)

float cx = (x0 – x1)/2 + x1;
float cy = (y0 – y1)/2 + y1;

2D触摸坐标转屏幕坐标

VECTOR2D touchPoint2D; 2D触摸點(x,y)
VECTOR3D touchPoint3D; 3D触摸點(x,y,z)

触摸坐标转3D世界坐标

Init_VECTOR2D(&touchPoint2D, cx, cy);
TouchToWorld(camera3D, &touchPoint2D, &touchPoint3D);

計两指距,

Init_VECTOR2D(&v0,x0,y0);
Init_VECTOR2D(&v1,x1,y1);
Sub_VECTOR2D(&vdiff,&v0,&v1);
length = Length_VECTOR2D(&vdiff);

指距拉開放大, 两指行埋縮細. 通過移3D相機實現縮放.

if(_length > length ) y = Camera3D.pos.y + 2; 縮細
if(_length < length ) y = Camera3D.pos.y – 2; 放大

 

游戲輵-弧形碰撞

游戲輵-弧形碰撞
游戲輵-弧形碰撞

事因『風水羅盤』由弧扇形基座組成. 要開發弧扇形碰撞技術.

先定義弧扇結构, 『角度』『弧度』係硬幣两面, 係相, 可相互轉換換

角度 = 弧度 * 180.0/PI
弧度= 角度 * PI/180.0

弧扇形基座有两『弧度』相等弧形, 离中點距离唔同, 遠离中點弧.較埋中點弧,

typedef struct ARC2D_TYP { 弧扇結构
VECTOR2D center; 中心點
float angle; 角度
float rotate; 轉旋
float far; 最远點
float near; 最近點
}ARC2D, *ARC2D_PTR;  

首要判断命中㸃是咪係『最远點』『最近點』之間.

命中㸃

Init_VECTOR2D(&va,x,y);

計觸摸㸃同弧中心㸃距離

Sub_VECTOR2D(&vdiff, &arc->center, &va);

計向量長度

float length = Length_VECTOR2D(&vdiff);

判断命中弧線之間

if(length < arc->near || length > arc->far )

return false;

計落點位於弧扇夹角之間. 弧扇夹两邊長壹致. 即等邊三角形, 視同两直角三角形.

sin(a)= 對邊/斜邊.  
a= asinf (對邊/斜邊) asinf(弧度)

計弧扇邊長

Copy_VECTOR2D(&va,&vdiff);

Init_VECTOR2D(&vb,0,length);

Sub_VECTOR2D(&vdiff, &va, &vb);

cEdge = Length_VECTOR2D(&vdiff);

計va和vb之间的夹角

cAngle = RAD_TO_DEG( asinf((cEdge / 2) / bEdge) ) * 2;

判断命中弧形夹角之間

begin = (-arc->angle/2) + arc->rotate ;

end   = (arc->angle/2) + arc->rotate ;

return Compute_Angle_In_RAC(cAngle, begin, end); // 夹角落㸃

 

判断頂是咪係弧內

bool Compute_Angle_In_RAC(float angle,float begin,float end){

float offset;

angle = Format_Angle(angle);//格式角

begin = Format_Angle(begin);//格式角

end = Format_Angle(end);//格式角

if(_begin > _end){

_end   = _end + 360;

if(_angle > 0 && _angle < end )

_angle = _angle + 360;

}

 

if( _angle >= _begin && _angle <= _end )// 夹角落㸃

return true; return false;

}

 

歸壹角/格式角

float Format_Angle(float angle){

if(angle < 0)

angle = angle + 360;

else

if(angle >= 360)

angle = angle – 360;

return angle;

}