jjzjj

弯曲的边界

大龙10 2023-10-15 原文

书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
目录

5.9 弯曲的边界

  如果你希望固定边界的表面是弯曲的(而不是一个多边形),ChainShape类能帮你实现这种效果。
  ChainShape类和PolygonShape类、CircleShape类相似,因此,我们可以用相同的步骤将它加入我们的程序。

1、第1步:定义一个物体

BodyDef db = new BodyDef();   物体不需要位置,ChainShape会帮我们指定位置;也不需要设置
typeBody body = box2d.world.createBody(bd);

2、第2步:定义形状

ChainShape chain = new ChainShape();

3、第3步:配置形状

  ChainShape对象代表一组相连的边。为了创建这样的链对象,我们必须先定义一个顶点(Vertice)数组(由Vec2对象组成的数组)。举个例子,如果我们想创建一条穿过整个窗口的直线,数组中只需要有两个顶点:(0,150)和(width,150)。(如果你想创建首尾相连的圈,也就是第一个顶点和最后一个顶点相连,可以使用ChainLoop类。)

Vec2[] vertices = new Vec2[2];
vertices[0] = box2d.coordPixelsToWorld(0,150);  加入屏幕右端的顶点
vertices[1] = box2d.coordPixelsToWorld(width,150); 加入屏幕左端的顶点

为了根据这些顶点创建链,我们需要将数组传入createChain()函数。

chain.createChain(vertices, vertices.length);如果你不想使用整个数组来创建链,可以传入

4、第4步:使用夹具将形状连接到物体上

  形状只有在和物体相连之后才能成为Box2D的一部分。尽管这是个固定的边界,它还是需要被连接在物体上。和其他形状一样,ChainShape对象也有摩擦和复原等属性,我们可以通过夹具(Fixture)设置这些属性。

FixtureDef fd = new FixtureDef();
fd.shape = chain;   分配给ChainShape对象的夹具
fd.density = 1;
fd.friction = 0.3;
fd.restitution = 0.5;
body.createFixture(fd);

  现在,我们要把ChainShape对象加入Sketch,方法和前面的固定边界一样。我们可以用Surface类完成这项工作。

5、示例

示例代码5-3 由3个固定顶点确定的ChainShape对象


有关弯曲的边界的更多相关文章

  1. ruby-on-rails - 在单词边界处将文本换行 - 2

    1)我想按单词自动换行,使每行不超过56个字符。有没有办法做到这一点,还是我需要自己动手?@comment_text="Loremipsumdolorsitamet,consecteturadipisicingelit,seddoeiusmodtemporincididuntutlaboreetdoloremagnaaliqua."我的看法:将呈现:Loremipsumdolorsitamet,consecteturadipisicingelit,seddoeiusmodtemporincididuntutlaboreetdoloremagnaaliqua.2)我想将文本缩进4个空格,

  2. javascript - 为什么 function.apply() 不能在 IE 中跨文档边界工作? - 2

    我在IE中看到一些奇怪的行为,试图通过function.apply()调用另一个页面中的函数。这是一个简单的测试用例:test1.html:varopened=null;functionapplyNone(){opened.testFunc.apply(opened);}functionapplyArgs(){opened.testFunc.apply(opened,["appliedarray"]);}functioncall(){opened.testFunc("calleddirectly");}functionremoteApply(){opened.testApply(["u

  3. javascript - 如何划分定向边界框? - 2

    我正在编写代码,为二维(不一定是凸的)多边形构建定向边界框(obb)树。到目前为止,我可以通过找到凸包并在凸包上使用旋转卡尺来找到多边形的面积最小obb。下图就是一个例子。带有红线和红点的黄色填充多边形描绘了原始多边形。凸包显示为蓝色和黑色线条,obb显示为紫色线条。(编辑)按要求:InteractiveVersion-仅在chrome中测试现在我想扩展我的代码来构建一个OBB树,而不仅仅是一个OBB。这意味着我必须切割多边形,并为多边形的每一半计算新的OBB。执行此操作的推荐方法似乎是通过将OBB切成两半来切割多边形。但是,如果我将obb从它的任一轴的中间切开,看起来我必须在多边形上

  4. javascript - 获取以屏幕像素为单位的旋转 SVG 元素的边界? - 2

    我正在尝试找到以屏幕像素为单位获取任意SVG元素边界框的最佳方法,以便正确覆盖HTML元素。到目前为止,我的方法是使用.getBBox()和.getCTM()检索对象的边界框和变换矩阵,然后将变换应用于边界框点如thisquestion的已接受答案中所述.//gettheelementvarel=$(selector)[0],pt=$(selector).closest('svg')[0].createSVGPoint();//gettheboundingboxandmatrixvarbbox=el.getBBox(),matrix=el.getScreenCTM();pt.x=bbo

  5. javascript - 使用 React.JS 检索和缓存 SVG 节点边界框​​的最佳方法 - 2

    我正在渲染带有标签的SVG组件。这些标签组件需要根据它们的文本内容(以及它们的大小)正确布局,以避免相互重叠。要获得每个标签的真实大小,似乎每次更新标签内容时都需要双重渲染。在标签组件级别,我需要第一次渲染检索真实SVGDOM节点的边界框出于性能原因缓存边界框重新渲染组件以根据其缓存的边界框调整标签位置然后,在每次重绘时:根据缓存的边界框渲染比较之前和更新的props之间的标签内容,如果有变化:更新并缓存标签边界框根据更新和缓存的边界框重新渲染到目前为止,这是我实现标签组件的方式:varLabel=React.createClass({updateBBox:function(){//T

  6. javascript - 模糊 SVG 中的边界 (Raphael.js) - 2

    我正在开发一个基于网络的编辑器,可以在其中拖动元素和调整元素大小。我遇到了关于显示1px边框和元素的问题:我得到了一条模糊线,而不是像素到像素显示(例如1px实线)。我发现,如果我使用末尾带有.5的坐标(例如10.5、124.5)和整数大小,一切都是像素完美的。这里是例子。在我改变它的坐标之前的元素:之后(每个整数大小末尾有“.5”):问题是我如何强制Raphael.js以清晰的方式显示所有内容? 最佳答案 我不确定如何在Raphael中执行此操作,但一点点CSS可以帮助您:.your_lines{shape-rendering:c

  7. javascript - POST 请求 header 中的内容类型缺少 FormData 边界 - 2

    我使用的代码与我在类似项目中成功使用的文件上传代码相同,但出于某种原因,边界从未添加到请求header中的内容类型属性中。这导致我的C#web-api函数无法检测到图像。这是我使用angularjs的发布请求:varformData=newFormData($('#testform')[0]);$http({url:serviceBase+'api/Client/'+item.practiceID+'/SavePhoto',method:"POST",data:formData,headers:{'Content-Type':false},transformRequest:functi

  8. javascript - 如何从谷歌地图获取纬度和经度边界 x y 和缩放参数 - 2

    我看过一些类似标题的问题,但它们似乎指的是x和y像素坐标。我要从GooglemapgetTile()函数中询问x和y的实际图block编号:澄清问题...给定getTile()函数中的x、y和缩放参数,如何找到图block的纬度和经度边界?CoordMapType.prototype.getTile=function(coord,zoom,ownerDocument){varx=coord.x,y=coord.y,url="http://mt1.google.com/vt/lyrs=y&x="+x+"&y="+y+"&z="+zoom;//otherstuff}目前我需要这个的唯一原因

  9. javascript - Node/Javascript 中的 RegEx - 如何获取模式匹配边界? - 2

    目前,我通过find()在Javascript/Node中使用正则表达式,这适用于查找模式的开头。但我也希望能够找出模式的结束位置。这可能吗? 最佳答案 如果您使用RegExp.exec()方法,您可以获得所需的信息。varpattern=/\d+\.?\d*|\.\d+/;varmatch=pattern.exec("thenumberis7.5!");varstart=match.index;vartext=match[0];varend=start+text.length;/\d+\.?\d*|\.\d+/等同于newRegE

  10. javascript - 当位置跨越第 180 条子午线时,如何使用 LocationRect.fromLocations() 正确获取边界框? - 2

    我正在使用v7BingMapsJavascript“控件”(我不知道为什么它被称为“控件”...)。我正在调用Microsoft.Maps.Map.setView({bounds:bounds})但它没有像我期望的那样工作。我有一组多边形,其点跨越第180条子午线。一个例子是新西兰岛屿的边界——其中一些位于180度经线以西,一些部分(查塔姆群岛)位于东经。当我用这些边界创建多边形并调用setView()时,mapwaaaaaay缩小。为什么?以及如何避免?Thispage提供问题的演示。这是代码。varmap,MM=Microsoft.Maps;functionshowMap(m){v

随机推荐