mathe
发表于 2016-10-15 12:27:18
另外我们还可以得出如果不限定每个面都反射一次,而是要求一个周期内所有面反射次数相同,方向也是唯一的
zeroieme
发表于 2016-10-15 12:53:37
接7楼
做了个2维的反射图
wayne
发表于 2016-10-15 14:58:26
mathe 发表于 2016-10-15 11:17
出发点我们总可以假设左平面,那么第二个点可以分为两种
i)右平面, 于是第三个点上下前后任意一个都类似 ...
沿用mathe的方法,不妨做一下标记。立方体的左平面标记为1,上前下后依次标记为2,3,4,5,右平面标记为6.
那么我们可以枚举一下所有的情况。
回路起点从1号开始。2,3,4,5是环形对称的,6是独特的,所以我们根据6的位置进行分类。
1)6在第二个,第六个位置的,需要将2345拆分成0+4的形式,对称性在4个面中展开,路径有 162345 162435 162354,123456123546 124356六种
2)6在第三个,第五个位置的,需要将2345拆分成1+3的形式,对称性在3个面中展开,所以 有 126345 126435,134562 143562 四种
3)6在第四个位置的,需要将2345拆分成2+2的形式,考虑对面和邻面。所以有 123645 132645 124635 三种
所以,总共有 6+4+3 = 13 种非平凡情况。比mathe的要少,mathe 帮忙核实一下, :)
wayne
发表于 2016-10-15 15:13:32
另外,根据计算得知,反射直线的切线向量 只是根据反射平面的特点取的相反值,其他分量不变。
建立坐标系,设前面是XOY第一象限。x向上取正,y向右取正,z向后取正。 则 正方体1号面的方程是 $x =0$ ,2号面的方程是 $z =1$ ,3号面的方程是 $z =0$ ,4号面的方程是 $y =0$ ,5号面的方程是 $y =1$ ,6号面的方程是 $x =1$
计算得出 入射直线的切向量是${n, p, k}$,经过点 ${x0, y0, z0}$,则入射直线与六个面相交后的反射直线的切向量和反射点坐标 如下图
(六个平面已经按照标号排序,第一个向量表示平面的法向量,第二个表示该平面上的一点)
可以看得出来,反射点的坐标是非常简洁的表达式,接下来,我们只需要随意选取楼上的一个路径进行迭代计算,然后带入边界条件计算即可。
wayne
发表于 2016-10-15 16:27:44
枚举一下前面提及的13个非平凡路径,计算得知只有一个解,124635.
解的一般条件是 入射直线在起点1号平面的交点的坐标${x_0,y_0,z_0}$,切线向量是${n,p,k}$
则$ 0 < z_0 < 1, 1 - z_0 < y_0 < 1,n:p:k = 1:-1:1$
光线路径分别经过的反射点是$ {0, y_0, z_0}, {1 - z_0, y_0 + z_0-1, 1}, {y_0, 0, 2 - y_0 - z_0}, {1, 1 - y_0, 1 - z_0}, {z_0, 2 - y_0 - z_0, 0}, {1 - y_0, 1,y_0 + z_0-1}, {0, y_0, z_0}}$
计算得知,每一个顶点处的夹角余弦是$1/3$
由于枚举的是全集, 所以说 不存在对边不相等的回路了。
GetReflectedLine[{{lineVector_,linePoint_},{surfaceVector_,surfacePoint_}}]:=Module[{p0=linePoint(*入射直线的决定点*),v0=lineVector(*入射直线的决定向量,即切向量*),p1=surfacePoint(*反射面的决定点*),v1=surfaceVector(*反射面的决定向量,即法向量*),X,Y,Z,P(*辅助计算的变量*),tmp},P={X,Y,Z};tmp=Solve==0,Map[#==0&,Cross,1]}],P][];{Solve[{Dot+Dot==0,Cross==Cross},P][],tmp}];
paths={162345,162435,162354,123456,123546,124356,126345,126435,134562,143562,123645,132645,124635};
faces={{{1,0,0},{0,0,0}},{{0,0,1},{0,0,1}},{{0,0,1},{0,0,0}},{{0,1,0},{0,0,0}},{{0,1,0},{0,1,0}},{{1,0,0},{1,0,0}}};p0={x0,y0,z0};ans=Table[{j,paths[],IncidentLine={{n,p,k},p0};data=Table[{i,IncidentLine=GetReflectedLine[{IncidentLine,faces[]}]},{i,RotateLeft]]]}];Reduce&,Drop]]],2]],Thread]==p0],Map&,Rest]}]/.List->And],data},{j,Length}];ans[]
wayne
发表于 2016-10-15 22:34:22
代码稍微修改了下。 暴力枚举了下 光线经过5,7个点回到原路的。均无解。
wayne
发表于 2016-10-15 23:48:13
光线回路 8个点有很多暴力枚举出来有24个,这24个的切向量都是$1:1:2$的各种变种。有可能是一个解。
{12346235,12356234,12436253,12456345,12536243,12546354,13246325,13256324,13426352,13456245,13526342,13546254,14236523,14256435,14326532,14356425,14526453,14536452,15236423,15246534,15326432,15346524,15426543,15436542}
入射直线在起点1号平面的交点的坐标${x_0,y_0,z_0}$,切线向量是${n,p,k}$
比如 路径 123462351:条件是 $x0=0, 1/2 < y0 < 1 , 2 - 2 y0 <= z0 < 1,n:p:k= 1:-1:2$
${{0,y0,z0},{(1-z0)/2,1/2 (-1+2 y0+z0),1},{(2-z0)/2,1/2 (-2+2 y0+z0),0},{y0,0,-2+2 y0+z0},{1,1-y0,z0},{(1+z0)/2,1/2 (3-2 y0-z0),1},{z0/2,1/2 (4-2 y0-z0),0},{1-y0,1,-2+2 y0+z0},{0,y0,z0}}$
mathe
发表于 2016-10-16 07:15:11
更多次反射同样可以用类似魔方上的方法作更简单.
我们可以考虑展开直线光线和三个方向平面交点数目。比如我们原题中解决的是2:2:2问题
而对于8次相交一般情况,我们可以要求每个方向至少相交一次,不然就转化为退化的二维问题了。
由此,可以有
6:1:1
5:2:1
4:3:1
4:2:2
3:3:2
这五种
其中只有4:2:2这种每个方向都相交偶数次,所以对应其实面和目标面上点的位置是相同的。(wanye说的光线方向是(1,1,2)应该就是4:2:2模式)
而对于其它几种,目标面上的点的位置不同(某个方向是奇数次相交,那么点需要相对这个方向对称变换一次即可)
mathe
发表于 2016-10-16 08:26:26
忘了考虑所有同方向面有两个,某个方向奇数次相当于落在对面,所以必须每个方向偶数次
wayne
发表于 2016-10-16 08:38:16
那就可以确定8个点的只有1:1:2这种情况了。对于10个点才有两个解1:1:3,1:2:2