我正在做一个Java项目并构建了一个像这样的Polygon:
DPolygons[NumberOf3DPolygons] = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0}, new double[]{0, 0, 3, 3}, Color.red);
而DPolygon类具有以下构造函数:
public DPolygon(double[] x, double[] y, double[] z, Color c)
{
Screen.NumberOf3DPolygons++;
this.x = x;
this.y = y;
this.z = z;
this.c = c;
createPolygon();
}
我想要做的是计算其z坐标的总和(在这种情况下将是= 6) 这就是我的想法:
sum = DPolygons[NumberOf3DPolygons].z[0]+DPolygons[NumberOf3DPolygons].z[1]+
DPolygons[NumberOf3DPolygons].z[2]+DPolygons[NumberOf3DPolygons].z[3];
但它提供NullPointerException
,因为它不会将DPolygons[NumberOf3DPolygons].z[0]
识别为多边形的第一个z值,依此类推。
有人能给我一个线索,访问每个z元素的正确语法是什么? (或者我怎么能得到这笔钱?)
答案 0 :(得分:0)
for(int i=0; i<DPolygons.length; i++){
//If you have some condition, you can put over here.
if(condition) {
sum = DPolygons[i].z + sum;
}
}
答案 1 :(得分:0)
全局变量z是否公开?
public double z;
但是,我建议在Dpolygon类中创建一个公共方法来检索全局z值并使用该getter而不是直接调用该属性。
课堂内:
public Double [ ] getZ (){return new Double (z[1],z [2],z [3]);}
答案 2 :(得分:0)
设计这样的课程......
public class DPolygon
{
private double[] x, y, z;
private Color color;
public DPolygon(double[] x, double[] y, double[] z, Color color)
{
// Number of polygons best found in containing class.
this.x = x;
this.y = y;
this.z = z;
this.color = Color;
}
public double[] getZ()
{
return z;
}
//...Other getters and setters.
}
使用带有嵌套foreach循环的ArrayList来获取所有多边形的所有z值...
ArrayList<DPolygon> dPolygons = new ArrayList<DPolygon>();
dPolygons.add(new DPolygon(new double[]{0, 2, 2, 3}, new double[]{0, 0, 0, 0}, new double[]{0, 0, 3, 3},Color.Red));
double sum=0;
for(DPolygon polygon : dPolygons)
{
for (double zValue : polygon.getZ())
{
sum += zValue;
}
}
对于特定的多边形......
double sum2 = 0;
//Change index number to whatever specific polygon you want to sum.
int specificPolygon=0;
// Then to sum.
for(double zValue : dPolygons.get(specificPolygon).getZ())
{
sum2 += zValue;
}
但如果你嫁给了一个阵列......
DPolygons[] dPolygons = new DPolygons[numberOfPolygons];
dPolygons[0] = new DPolygon(new double[]{0, 2, 2, 3}, new double[]{0, 0, 0, 0}, new double[]{0, 0, 3, 3},Color.Red)
//...Adding other polygons
// For single polygon
double sum3 = 0;
// As before, set specificPolygon equal to the index of the polygon you want.
int specificPolygon = 0;
for(double zValue : dPolygons[specificPolygon].getZ())
{
sum3 += zValue;
}
最后一种方法的问题是,在初始化阵列时,您需要知道屏幕上多边形的数量。您无法在运行时动态添加更多内容。
答案 3 :(得分:0)
我想要做的是计算其z坐标的总和(在这种情况下将是= 6)
如果我是你,我会为z的总和(甚至是x和y的总和)创建一个方法:
viewController.delegate
例如,如果您有一个3D多边形数组:
class DPolygon
{
private double[] z;
//Your other attributes here..
//Your constructors here..
public double getSumOfZ(){
double sum = 0.0;
if(z != null && z.length > 0)
for(int i=0; i<z.length; i++)
sum += z[i];
return sum;
}
}
要从特定的3D多边形访问z的总和:
//Outside the class (for e.g. from the main method):
DPolygon poly1 = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0}, new double[]{0, 0, 3, 3}, Color.red)};
DPolygon poly2 = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0}, new double[]{0, 0, 3, 3}, Color.red)};
DPolygon poly3 = new DPolygon(new double[]{0, 2, 2, 0}, new double[]{0, 0, 0, 0}, new double[]{0, 0, 3, 3}, Color.red)};
DPolygons[NumberOf3DPolygons] polygons3D = {poly1, poly2, poly3};
但是它给出了NullPointerException,因为它没有识别多边形[NumberOf3DPolygons] .z [0]作为多边形的第一个z值,依此类推。
在您的案例中polygons3D[0].getSumOfZ(); //Get sum of z from first polygon
有两种可能性:
确保从DPolygon类初始化NullPointerException
:
z array
答案 4 :(得分:0)
关于这个主题还有两个更简洁的概念:Collections和Java 1.8中的新内容,Reduction的Streams。
使用List将消除因尝试使用全局变量管理动态数组而导致的NullPointerExceptions。
在您的情况下,在Screen.NumberOf3DPolygons
的构造函数中递增DPolygon
不适合它。如果构造另一个DPolygon
而不将其添加到该数组会发生什么?您可能希望在管理阵列的对象中使用add
方法使该变量与添加到列表中的元素数量一致。幸运的是,这已经在Java Collections类中为我们完成了。
这是使用Collections演示相关代码的工作再现,以及另一个好东西:用于计算z坐标之和的单行代码。
import java.awt.Color;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main1
{
public static class Screen
{
List<DPolygon> polygons = new ArrayList<>();
}
public static class DPolygon
{
private double[] x, y, z;
private Color c;
public DPolygon( double[] x, double[] y, double[] z, Color c )
{
this.x = x;
this.y = y;
this.z = z;
this.c = c;
}
public double sumZ()
{
return Arrays.stream( z ).sum();
}
}
public static void main( String[] args )
{
Screen screen = new Screen();
screen.polygons.add(
new DPolygon(
new double[] { 0, 2, 2, 0 },
new double[] { 0, 0, 0, 0 },
new double[] { 0, 0, 3, 3 },
Color.red ) );
System.out.println( screen.polygons.get( 0 ).sumZ() );
}
}
当您尝试为特定索引使用至少两个x
,y
和z
时,仍有可能获得IndexOutOfBoundsException:我们不确定每个点有3个坐标,因为有些数组可能小于另一个数组。为了确保所有点都有3个坐标,你可以将它们分组:
screen.polygons.add(
new Polygon(
Color.RED,
new double[] { 0, 0, 0 },
new double[] { 2, 0, 0 },
new double[] { 2, 0, 3 },
new double[] { 0, 0, 3 } ) );
使用此DPolygon
类:
public static class DPolygon
{
List<double[]> points = new ArrayList<>();
Color color;
public DPolygon( Color c, double[]... coords )
{
this.points = Arrays.asList( coords );
this.color = c;
}
public double sumZ()
{
return points.stream().mapToDouble( ( p ) -> p[2] ).sum();
}
}
你可以更进一步,将这一点抽象为
public static class Point3D
{
double x, y, z;
public Point3D( double x, double y, double z )
{
this.x = x;
this.y = y;
this.z = z;
}
}
通过将double[]
更改为Point3D
,将new double[]{ ... }
更改为new Point3D( ... )
,将( p ) -> p[2]
更改为( p ) -> p.z
,可以轻松支持。
还有一件事:Java Code Conventions建议标识符只有在大写字母,接口,枚举等时才以大写字母开头 - 它们不应该用于参数,局部变量或字段。几乎每个人都会认为Screen.NumberOf....
是类Screen
中的静态字段(通过将其视为整数而将其视为嵌套类)。
我的想法是,如果我输入com.Foo.Bar.baz.hmm
,每个人都知道com
是包名,Foo
是一个类,Bar
是嵌套类Foo$Bar
,{ {1}}是类baz
中的静态字段,Bar
是对象hmm
的字段。