要用射线去检测碰撞,之前我们先从一个点开始。如果能够判断一个点是否和多边形碰撞,那么就可以轻易的扩展到,线和多边形,多边形和多边形的碰撞。点与多边形的碰撞是基于这个实现,PNPOLY – Point Inclusion in Polygon Test。
C 实现射线检测多边形碰撞
C++ 标准库中的那些大坑
变量初始化
这是使用 C++11 codecvt 时遇到的一个坑,转换编码时,mbstate_t 这个中间状态变量,必须初始化为0,否则运行出错,即:
// 不可以!
mbstate_t mbst;
// 这样可以
mbstate mbst = {0};
// 这样也行
mbstate mbst = mbstate_t();
// 不可以!
mbstate_t mbst;
// 这样可以
mbstate mbst = {0};
// 这样也行
mbstate mbst = mbstate_t();
这是第一个坑,并不算太坑,还比较容易调试和发现,也怪自己大意了。
C++模板特化与偏特化
前言
说到C++模板,这个已经不是什么新东西了,自己在实际开发中也用过;对于C++模板特化和偏特化,对于别人来说,已经不是什么新东西了,但是对于我来说,的确是我的盲区,那天在群里讨论这个问题,自己对于这部分确实没有掌握,又联想到在《STL源码剖析》一书中,对于此也是有着介绍。所以,今天就对此进行详细的总结,以备后忘。
C++类模板的三种特化
说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相信了解的人就不是很多。我这里归纳了针对一个模板参数的类模板特化的几种类型, 一是特化为绝对类型; 二是特化为引用,指针类型;三是特化为另外一个类模板。
C++11 随机数库
简介
之前,C++中的随机数生成都依赖于一个简单的rand函数。这个函数产生一定范围内的一个均匀随机整数。如果需要其他随机分布或者其他范围的随机数,就需要根据rand函数产生的随机数进行再加工,不过这时,就容易引入非随机性了。
462 字节 C 代码实现雅虎 logo ACSII 动画
#include <stdio.h>
#include <math.h>
#include <unistd.h>
int c,p,i,j,n,F=40,k,m;
float a,x,y,S=0,V=0;
void main()
{
for(;F--;usleep(50000),F?puts("x1b[25A"):0)
{
for(S+=V+=(1-S)/10-V/4,j=0;j<72;j+=3,putchar(10))
{
for(i=0;x=S*(i-27),i++<73;putchar(c[" ''".$u$"]))
{
for(c=0,n=3;n--;)
{
for(y=S*(j+n-36),k=0,c^=(136*x*x+84*y*y<92033)<<n,p=6,m=0;m<8;
k++["<[]O=IKNAL;KNRbF8EbGEROQ@BSX""XtG!#t3!^"]/1.16-68>x*cos(a)+y*sin(a)?k=p,p="<AFJPTX"[m++]-50:k==p?c^=1<<n,m=8:0)
{
a=(k["O:85!fI,wfO8!yZfO8!f*hXK3&fO;:O;#hP;"i[by asloane"]-79)/14.64;
}
}
}
}
}
return;
}
运行后,你将会看到:

它是一个 20fps、抗锯齿的 Yahoo! logo ASCII 动画。如果你想自己弄清楚它是如何工作的,那么可以忽略下面的内容。否则,请往下读。
狼与哈士奇
狼是自然界中真正的掠食者,而哈士奇不过是人类的玩物。两者长得确实很像,就如同 IT 界的 Programmer 和 Coder。如果用狼和哈士奇来隐喻这两种职业,Programmer 无疑是软件业真正的狼。
软件项目免坑指南
“谁也无法改变现状,唯有无数程序员血洒大地,才能使项目重建天日。”这一点也不夸张,软件项目做烂了就是个坑,参与者也不过是填坑的。就像是在魔兽世界战场遇到国家队一样,你赢也赢不了,出也出不去。
链家理房通:正确的产品,难看的吃相
说起理房通,可能很多人都不知道这到底是一个什么样的产品。但在2015年末,随着链家董事长左晖在集团年会上的讲话一夜之间传遍业内之后,越来越多的人开始关注到这个由链家一手孵化出来、左晖口中的『这就是我们要做的房地产金融』业务。
DataTable多线程写不安全
如下代码:
class test
{
private DataTable ftable;
public test()
{
ftable = new DataTable();
DataColumn col = new DataColumn("COL_1", typeof(int));
ftable.Columns.Add(col);
col = new DataColumn("COL_2", typeof(int));
ftable.Columns.Add(col);
for (int i = 1; i < 100; i++)
{
DataRow row = ftable.NewRow();
row["COL_1"] = i;
row["COL_2"] = i * 2;
ftable.Rows.Add(row);
}
}
public void AddColTest()
{
DataColumn col = new DataColumn("COL_Test", typeof(int));
ftable.Columns.Add(col);
Parallel.For(0, ftable.Rows.Count, (index) =>
{
Thread.Sleep(500);
DataRow row = ftable.Rows[index];
row["COL_Test"] = Convert.ToInt32(row["COL_1"]) + Convert.ToInt32(row["COL_2"]);
});
}
public void ShowTable()
{
for(int index = 0; index < ftable.Rows.Count; ++index)
{
DataRow row = ftable.Rows[index];
Console.WriteLine(String.Format("{0} \t\t {1} \t\t {2}", row["COL_1"], row["COL_2"], row["COL_Test"]));
}
}
}
class Program
{
static void Main(string[] args)
{
test t = new test();
t.AddColTest();
t.ShowTable();
Console.ReadKey();
}
}
我本来以为虽然DataTable不是线程安全的… 但是我并没有对任何一个数据做增删…我只是修改了现有单元格的值…理应不会出现任何问题…DataTable应该是已经分配好的内存…