我希望为我的2D游戏创造平滑的道路。看着CatmullRomSpline
这正是我需要的东西。每一篇文章,甚至在SE
上,都给它一个类型,并用构造函数传递所有控制点和一个布尔
。这似乎是过时的,CatmullRomSpline
不再接受任何类型参数,没有它,它只能与V3
路径工作。构造函数也不接受控制点列表。
cp = new Vector2[]
{
new Vector2(0,100), new Vector2(100,600), new Vector2(300,300), new Vector2(600, 400)
};
CatmullRomSpline<Vector2> path = new CatmullRomSpline<Vector2>(cp, true);
这会产生以下错误:类型CatmullRomSpline不是泛型的;它不能用参数参数化
我是否遗漏了一些东西,或者CatmullRomSpline现在的工作方式有所不同,以及如何做到?
这是badlogic的CatmullRomSpline类。看起来事情确实变了,我从“import com.badlogic.gdx.math.CatmullRomspeline
公共类CatmullRomSpline实现可序列化的{private static final long serialVersionUID=-3290464799289771451L;private List controlPoints=new ArrayList();Vector3 T1=new Vector3();Vector3 T2=new Vector3();
/**添加一个新的控制点**@param point点*/public void add(Vector3点){controlPoints.add(point);}
/**@return all control points*/public List getControlPoints(){return controlPoints;}
/**返回一个路径,在每两个控制点之间,将生成NumPoint,并添加控制点本身。*第一个和最后一个控制点被省略.如果有少于4个控制点一个空的路径被返回。**@参数NumPoint为段返回的点数*@返回路径*/公共列表getPath(int NumPoint){ArrayList点=new ArrayList();
if (controlPoints.size() < 4) return points;
Vector3 T1 = new Vector3(); Vector3 T2 = new Vector3();
for (int i = 1; i <= controlPoints.size() - 3; i++) {
points.add(controlPoints.get(i)); float increment = 1.0f /
(第1个要点);浮动t=增量;
T1.set(controlPoints.get(i + 1)).sub(controlPoints.get(i -
1). mul(0.5f); T2.set(控制器Points.get(i 2)). sub(控制器Points.get(i)). mul(0.5f);
for (int j = 0; j < numPoints; j++) {
float h1 = 2 * t * t * t - 3 * t * t + 1; // calculate basis
// function 1
float h2 = -2 * t * t * t + 3 * t * t; // calculate basis
// function 2
float h3 = t * t * t - 2 * t * t + t; // calculate basis
// function 3
float h4 = t * t * t - t * t; // calculate basis function 4
Vector3 point = new Vector3(controlPoints.get(i)).mul(h1);
point.add(controlPoints.get(i + 1).tmp().mul(h2));
point.add(T1.tmp().mul(h3));
point.add(T2.tmp().mul(h4));
points.add(point);
t += increment; } }
if (controlPoints.size() >= 4)
要点。添加(controlPoints.get(controlPoints.size()-2));
return points; }
/**返回一个路径,在每两个控制点之间,将生成NumPoint,并添加控制点本身。*第一个和最后一个控制点被省略.如果有少于4个控制点一个空的路径被返回。**@参数指向Vector3实例的数组,以将路径存储在*@参数NumPoint为段返回的点数*/公共无效getPath(Vector3[]点,int NumPoint){int idx=0; if(ControlPoints.size()
for (int i = 1; i <= controlPoints.size() - 3; i++) {
points[idx++].set(controlPoints.get(i)); float increment = 1.0f
/(第1个要点);浮动t=增量;
T1.set(controlPoints.get(i + 1)).sub(controlPoints.get(i -
1). mul(0.5f); T2.set(控制器Points.get(i 2)). sub(控制器Points.get(i)). mul(0.5f);
for (int j = 0; j < numPoints; j++) {
float h1 = 2 * t * t * t - 3 * t * t + 1; // calculate basis
// function 1
float h2 = -2 * t * t * t + 3 * t * t; // calculate basis
// function 2
float h3 = t * t * t - 2 * t * t + t; // calculate basis
// function 3
float h4 = t * t * t - t * t; // calculate basis function 4
Vector3 point = points[idx++].set(controlPoints.get(i)).mul(h1);
point.add(controlPoints.get(i + 1).tmp().mul(h2));
point.add(T1.tmp().mul(h3));
point.add(T2.tmp().mul(h4));
t += increment; } }
points[idx].set(controlPoints.get(controlPoints.size() - 2)); }
/**返回路径中点的所有切线。与getPath相同的语义学。**@参数NumPoint为段返回的点数*@返回路径中的点的切线*/公共列表getTangents(int NumPoint){ArrayList切线=new ArrayList();
if (controlPoints.size() < 4) return tangents;
Vector3 T1 = new Vector3(); Vector3 T2 = new Vector3();
for (int i = 1; i <= controlPoints.size() - 3; i++) { float
增量=1.0f/(数值1);浮动t=增量;
T1.set(controlPoints.get(i + 1)).sub(controlPoints.get(i -
1). mul(0.5f); T2.set(控制器Points.get(i 2)). sub(控制器Points.get(i)). mul(0.5f);
tangents.add(new Vector3(T1).nor());
for (int j = 0; j < numPoints; j++) {
float h1 = 6 * t * t - 6 * t; // calculate basis function 1
float h2 = -6 * t * t + 6 * t; // calculate basis function 2
float h3 = 3 * t * t - 4 * t + 1; // calculate basis function 3
float h4 = 3 * t * t - 2 * t; // calculate basis function 4
Vector3 point = new Vector3(controlPoints.get(i)).mul(h1);
point.add(controlPoints.get(i + 1).tmp().mul(h2));
point.add(T1.tmp().mul(h3));
point.add(T2.tmp().mul(h4));
tangents.add(point.nor());
t += increment; } }
if (controlPoints.size() >= 4)
tangents.add(T1.set(controlPoints.get(controlPoints.size() -
1)). sub(控制oints.get(控制oints.size()-3)). mul(0.5f). cpy(). nor());
return tangents; }
/**返回路径中点在二维空间中的所有切线法线。控制点必须位于x/y平面上,才能工作。与getPath.*的语义相同@param numPoints为段返回的点的数目*@返回路径中点的切线*/public List getTangentNormals2D(int numPoints){ArrayList tangents=new ArrayList();
if (controlPoints.size() < 4) return tangents;
Vector3 T1 = new Vector3(); Vector3 T2 = new Vector3();
for (int i = 1; i <= controlPoints.size() - 3; i++) { float
增量=1.0f/(数值1);浮动t=增量;
T1.set(controlPoints.get(i + 1)).sub(controlPoints.get(i -
1). mul(0.5f); T2.set(控制器Points.get(i 2)). sub(控制器Points.get(i)). mul(0.5f);
Vector3 normal = new Vector3(T1).nor(); float x = normal.x;
normal.x = normal.y; normal.y = -x; tangents.add(normal);
for (int j = 0; j < numPoints; j++) {
float h1 = 6 * t * t - 6 * t; // calculate basis function 1
float h2 = -6 * t * t + 6 * t; // calculate basis function 2
float h3 = 3 * t * t - 4 * t + 1; // calculate basis function 3
float h4 = 3 * t * t - 2 * t; // calculate basis function 4
Vector3 point = new Vector3(controlPoints.get(i)).mul(h1);
point.add(controlPoints.get(i + 1).tmp().mul(h2));
point.add(T1.tmp().mul(h3));
point.add(T2.tmp().mul(h4));
point.nor();
x = point.x;
point.x = point.y;
point.y = -x;
tangents.add(point);
t += increment; } }
return tangents; }
for (Vector3 tangent : tangents) normals.add(new
向量3(正切). crs(up). nor());
return normals; }
公共列表getTangentNormals(int numPoints,List up){List切线=getTangents(numPoints);ArrayList法线=新ArrayList();
int i = 0; for (Vector3 tangent : tangents) normals.add(new
向量3(正切). crs(up.get(i)). nor());
return normals; } }
根据api和源代码,您的代码应该可以正常工作。
这个类是泛型的。您必须使用该类的某个旧版本
更新至最新版本,错误应得到解决。
希望这有帮助。
问题内容: 我得到以下错误,尽管它恰好是示例中使用的错误: 错误:类型列表未接受参数 Java是1.7版,该类未命名。 问题答案: 您可能正在导入而不是
我试图通过RESTendpoint将数据从一个服务器发送到另一个服务器: 服务器B启动此请求: 服务器A接收请求并返回文件: 因此,很明显,我必须将声明更改为: 或者到 然后错误消失了,但我丢失了HttpStatus。回复时是否有确认信息?这里的正确解决方案是什么?
问题内容: 我正在写一个方法,该方法应接受不共享除父对象以外的父类型的两种类型之一的对象作为其参数。例如,类型为Dreams和Garlic。您可以同时和。我想有一个方法,可以将Dreams和Garlic都接受为其参数。 Garlic和dreams都是某些库的一部分,因此让它们实现ICrushable接口(以便我可以编写)是不可行的。 我的方法主体很长,因此重载将意味着复制代码。丑陋。我确定我可以使
这似乎很奇怪,这并不像我预期的那样有效。我编写了一个简单的java类,它实现了可比接口并重写了compareTo()方法。但是,它不允许我传递Object以外的特定类型的参数。我在网上查看了其他人的代码,他们确实使用了其他类型的对象,我将他们的代码复制到eclipse中,但我仍然得到了同样的错误。 我的问题是;我必须做什么来比较这个对象和类型的对象,让我们说Person。比较器接口(compare
我和这里的用户遇到了同样的问题:log4j类型genericopobjectpool不接受参数,但我一直无法找到这个问题的答案。Log4j2在附加到rollingfile时起作用,但此处列出的方法:https://logging.apache.org/log4j/2.x/manual/appenders.html显示错误“GenericObjectPool不接受参数”
问题内容: 我想了解为什么下面的代码片段无法编译。将函数接受为可能具有任何返回类型的函数参数的Go方法是什么? 播放:https://play.golang.org/p/CqbuEZGy12 我的解决方案基于Volker的答案: 播放:https://play.golang.org/p/waOGBZZwN7 问题答案: 你绊倒了围棋新人一个非常普遍的误解:空接口并 不能 意味着“任何类型”。确实不