本站建議搭配 Hover Zoom+ chrome 擴充套件,可自動放大圖片
( 站內文介紹: https://goo.gl/BnBSGa )
網站搜索不是很好用建議使用google底下括號內是範例,整串打進google搜索內;
[ site:https://charlottehong.blogspot.tw/ 你要搜索的內容 ]
2017年11月19日 星期日
2017年11月16日 星期四
[原始碼] C / C++ 線性插補 bilinear 與注意事項
[原始碼] C / C++ 線性插補 bilinear 與注意事項
https://www.wikiwand.com/en/Bilinear_interpolation
就是依照比例取因為比較靠近A所以分到的A比較多,離B比較遠分到的就比較少
AB = A*dx2 + B*dx1
然後再把AB跟CD這兩個點在做一次運算就可以算出中間那個點了
float AB = A*dx2 + B*dx1;
float CD = C*dx2 + D*dx1;
float X = AB*dy2 + CD*dy1;
實作代碼
獲取鄰點
使用 ceil() 這樣就可以正確獲得了
獲取比例
/*****************************************************************
Name :
Date : 2017/11/16
By : CharlotteHonG
Final: 2017/11/16
*****************************************************************/
#include <iostream>
#include <cmath>
using namespace std;
float linear(int* arr, float pos){
// 獲取鄰點(不能用 1+)
size_t c0 = floor(pos);
size_t c1 = ceil(pos);
// 獲取比例(只能用 1-)
float dx1 = pos - c0;
float dx2 = 1 - dx1;
// 乘出比例(要交叉)
float X = arr[c0]*dx2 + arr[c1]*dx1;
return X;
}
float bilinear(int* arr, size_t w, float y, float x){
// 獲取鄰點(不能用 1+, 選中結尾時 x0=x1=W-1 才是對的)
size_t x0 = floor(x);
size_t x1 = ceil(x);
size_t y0 = floor(y);
size_t y1 = ceil(y);
// 獲取比例(只能用 1-, 選中結尾時 1:0 才是對的)
float dx1 = x - x0;
float dx2 = 1 - dx1;
float dy1 = y - y0;
float dy2 = 1 - dy1;
// 獲取點
const float& A = arr[y0*w + x0];
const float& B = arr[y0*w + x1];
const float& C = arr[y1*w + x0];
const float& D = arr[y1*w + x1];
// 乘出比例(要交叉)
float AB = A*dx2 + B*dx1;
float CD = C*dx2 + D*dx1;
float X = AB*dy2 + CD*dy1;
return X;
}
//================================================================
int main(int argc, char const *argv[]){
int arr[] = {0, 10};
cout << linear(arr, 0.1f) << endl;
int arr2[] = {0, 0, 10, 10};
cout << bilinear(arr2, 2, 0.1f, 0.1f) << endl;
return 0;
}
//================================================================
縮放比例
// 縮小向中間對齊
r=srcW/dstW;
double srcX = (dstX+r) * ((double)srcW/dstW) - r;
double srcY = (dstY+r) * ((double)srcH/dstH) - r;
原理其實就是原本會向左上角也就是原點對齊,然後再加上偏差值讓他向中間對齊。
// 縮小的倍率
double r1W = ((double)src.width )/(dst.width );
double r1H = ((double)src.height)/(dst.height);
// 縮小時候的誤差
double deviW = ((src.width-1.0) - (dst.width -1.0)*(r1W)) /dst.width;
double deviH = ((src.height-1.0) - (dst.height-1.0)*(r1H)) /dst.height;
// 縮小保持邊緣對齊
srcX = i*(r1W+deviW);
srcY = j*(r1H+deviH);
公式從原本的向原點對齊,會產生一定誤差,把這個誤差分攤給每個位置。
// 放大保持邊緣對齊
double srcX = (dstX)* ((width-1.0) / (newW-1.0));
double srcY = (dstY)* ((height-1.0) / (newH-1.0));
另外上述算是為了表達沒有加上(double)轉型修飾,是因為有 +1.0 會自動隱式轉型,所以不用補。但是如果是 (int)/(double) 就要補,這個是後面的會隱式轉型成 (int)。
參考
2017年11月14日 星期二
微信支付只綁定台灣信用卡,使用權限與金額上限
微信支付只綁定台灣信用卡,使用權限與金額上限
[圖文] 微信支付|只綁台灣信用\金融卡|不用別人給紅包
法規
2018.11更新
使用範圍
答案是部分可以的,支付有分兩種,一種是你掃對方的QR碼然後支付,這種的有出租車線上網購等等,單綁台灣信用卡即可支付使用,需要注意上限額度就好。另一種是對方掃你的QR碼,例如大陸境內百貨公司,這個只有單綁台灣信用卡是不能支付的,推測綁定大陸銀行卡才行。
不能在百貨公司支付怎麼辦?
台灣 支付寶 實名驗證圖文步驟
這個權限幾乎等同於大陸了,在百貨公司實測給店家掃碼可以支付;只差不能在台灣支付,一樣需要大陸身分證驗證。
2017年11月13日 星期一
C / C++ 函式傳遞二維陣列 範例與解說
C / C++ 函式傳遞二維陣列 範例與解說
一維陣列的傳遞
一維陣列常見的方法是這樣傳遞的
void fun(int* p){...}
int arr[10]={};
fun(arr);
這時候編譯器會自動將 型態::int[10]
轉成 型態::int*
然後成功的傳遞
但是這裡有個但書,只有最高維度可以自動轉換或計算,剩下的皆要手動指定
舉個例子來說明
// 錯誤
int arr[][] = {{0,1},{2,3}};
// 正確
int arr[][2] = {{0,1},{2,3}};
編譯器只會自動補上 最左邊的[] ,只有最左邊可以留空
在函式上二維的傳遞方式也是一樣的邏輯,想傳遞這個二維可以改成這樣
// 寫法1
void fun(int p[][2]){...}
// 寫法2 (等價於第一種,看個人習慣選擇即可)
void fun(int (*p)[2]){...}
這樣就可以正常傳遞了,只是有個缺點二維的長度被限制了。
不定長度的二維傳遞 - 手動轉型
那如果要傳遞不定長的二維就必須使用指標的指標 int**
來傳遞
不過這樣的用法沒辦法直接從int(*)[n]
轉型,必須手動轉型
如果想要自動轉型成 int**
反推一下就要使用 int*
的陣列來轉型
int
的陣列是一個陣列裡面放著一堆int
int*
的陣列是一個陣列裡面放著一堆int*
就是說二維陣列,可以想像成有一個一維陣列
裡面放著一堆一維陣列
// 宣告二維陣列
int arr1[2][2] = {{1,2},{3,4}};
// 取出一維陣列位址
int* a1 = arr1[0];
int* a2 = arr1[1];
// 把一維地址寫進陣列裡
int* p1[2];
p1[0] = a1;
p1[1] = a2;
現在p1可以自動轉型成 int**
了,可以將它傳入了 int**
的函式內了
會弄得這麼麻煩是因為維度的長度
,本身就屬於型態的一部分。陣列長度10跟陣列長度11的差別就好像 int 跟 char 的差別一樣完全是不一樣的東西
而編譯器只會幫你處理最高維度的自動計算而已,所以二維以上不定長度的傳遞在C語言上比較棘手。C++的話有樣板可以自動處理就沒這個困擾了。
範例
/*****************************************************************************
Name :
Date : 2018/06/13
By : CharlotteHonG
Final: 2018/06/13
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define WIDTH 2
#define HEIGHT 3
void fun(int** p) {
for (int j = 0; j < HEIGHT; ++j) {
for (int i = 0; i < WIDTH; ++i) {
printf("%d, ", p[j][i]);
} printf("\n");
}
}
int main(int argc, char **argv) {
int arr[HEIGHT][WIDTH] = {};
int* p[HEIGHT];
for (int j = 0; j < HEIGHT; ++j) {
p[j] = arr[j];
for (int i = 0; i < WIDTH; ++i) {
arr[j][i] = 1;
}
}
fun(p);
return 0;
}
如何傳遞陣列的長寬
這是轉成指標之後的缺點,他將會遺失陣列的長度資訊,常見辦法
- 讓函式多一個參數傳入
- 用陣列的第一個數值來當作長度
C++的樣板可以解決這個問題,寫法如下
template<size_t N, size_t N2>
void fun(int (&arr)[N][N2]) {...};
如此一來就可以完整的傳入鎮列了,在函式內 N1 及 N2 就是傳入的二維長度,一維或是三維以上只要調整N的數量對應即可。
2017年11月12日 星期日
Android SONY 手機 Z、XZ系列 OTG 接上後毫無反應
Android SONY 手機 Z系列 OTG 接上後沒有反應
設定方法
設定內
-> 裝置連線
-> 下方 USB連線
-> 偵測USB裝置
其他
2017年10月29日 星期日
購買 淘寶 注意事項,什麼是普貨、特貨,走私,那些台灣禁運
購買 淘寶 注意事項,什麼是普貨、特貨,禁運、敏感特貨,走私,那些台灣禁運
前言
特貨等於走私嗎?
- 違反航空規定 (電池有爆炸疑慮)
- 違反輸入國家進口法律規定
- 違反輸出國家出口法律規定
- 明顯公認違禁品 (毒品、槍械)
- 海關主觀認定 (模糊地帶)
就只有這樣,還是可能會違法的,責任也是算你頭上的。
如果只差中國出口不合法那你跑特貨就是完全合法。
- 超過$3000被抽到補稅
- 抽查補委任書
- 違反當地輸入法規
好的集運商特貨可能會幫你服務這些,或給你一些幫助意見
這邊沒過也有可能被退回去中國的
運了明顯有問題的東西就自行承擔責任了
https://www.taobao.com/go/chn/transit/interdict/cht.php
2違反輸入國家進口法律規定
可能會收到法院傳票,這點要特別當心有可能前面全部都合法安全到台灣,到台灣來查之後發現你違法;尤其是藥事法,品項有隱形眼鏡和電子菸油這不能買,被查到會被起訴QuQ流程
中國運輸:
- 賣家出貨
- 中國境內運輸
- 轉運商收貨 (品項敏感詞直接拒收)
- 轉運商出貨到機場
- 機場檢查
- 機場清關(飛往台灣)
台灣運輸
- 機場抽檢或全檢 (補稅、補委任書或是違法會卡在這裡)
- 機場清關
- 黑貓接手(或是超商物流)
http://charlottehong.blogspot.com/2017/10/blog-post_26.html
- 獲得海關重點關注名單(可能以後你進口都是最高規格檢查)
- 集運商被海關黑單+罰款賠錢+重點關注名單
- 跟你搭同一台飛機的貨,大家一起卡關1~2個月
特貨被台灣海關抽檢了就不要爭執說我這是特貨怎樣的,沒這回事唷。
這句話的翻譯是:海關我運了可能不合法的東西。
關於私運與官方集運
- 先問你想要的集運商能不能運(旺旺密)
- 你把東西買下填集運商地址
- 把商品淘寶貨單給集運(旺旺密),集運收到之後會報重量給你
- 還有想買的東西重複1~3
- 看多重去集運商的淘寶,一次拍下相應的運費商品
- 等收貨
這邊如果貨單搞錯也是有可能發生特貨當普貨寄出的狀況歐!如果要同時由同一家運普貨與特貨建議在跟集運商確認一次貨單。