#java #processing
#java #обработка
Вопрос:
Я пытаюсь создать пользовательский класс Matrix в Processing для работы с любым количеством измерений. Класс rotationMatrix является производным от него. Но я не могу получить доступ к методам rotationMatrix, как если бы они не существовали. Мои матричные классы:
class Matrix{
float[][] list;
int[] dims;
public Matrix(int cols, int rows){
list = new float[cols][rows];
dims = new int[] {cols, rows};
}
void Identity(){
list = new float[dims[0]][dims[1]];
for(int v=0;v<min(dims[0], dims[1]); v ){
list[v][v] = 1;
}
}
float[] mult(float[] vector){
if(vector.length!=dims[0]) return vector;
float[] result = new float[dims[0]];
for (int i = 0; i<result.length;i ){
float d = dot(vector, list[i]);
result[i] = d;
}
return resu<
}
float dot(float[] v1, float[] v2){
float result=0;
for(int i = 0; i<v1.length;i ){
result =v1[i]*v2[i];
}
return resu<
}
String toString(){
String result="{";
for(int y = 0; y<dims[1]; y ){
if(y>0)result =" ";
result ="(";
for(int x=0; x<dims[0];x ){
result =list[x][y];
if(x 1<dims[0]) result =", ";
}
result =")";
if(y 1<dims[1]) result =",nn";
}
result ="}";
return resu<
}
}
class RotationMatrix extends Matrix {
public float angle, scale;
int ax1, ax2;
int dim;
public RotationMatrix(int dim){
super(dim, dim);
ax1=0;
ax2=1;
this.dim=dim;
}
public RotationMatrix(int dim, int a1, int a2){
super(dim, dim);
ax1=min(a1, a2);
ax2=max(a1, a2);
this.dim=dim;
}
void Update(){
for(int y = 0; y<dim;y ){
for(int x = 0; x<dim;x ){
if(x==y) {
if(x==ax1||y==ax2) {
list[x][y] = cos(angle)*scale;
}
else {
list[x][y]=1;
}
}
else{
if(x==ax2amp;amp;y==ax1){
list[x][y]=-sin(angle)*scale;
}
if(x==ax1amp;amp;y==ax2) {
list[x][y] = sin(angle)*scale;
}
}
}
}
}
}
Теперь используя матрицу вращения:
m=new RotationMatrix(3);
m.Update();
И этот вызов метода обновления выдает ошибку «Функция «Update()» не существует». Что я делаю не так? Я относительно новичок в обработке.
Редактировать: пометка «Обновить» как общедоступной не помогла, перезапуск обработки также.
Комментарии:
1.
m
не должен объявляться какMatrix
(я предполагаю, что это так), но должен быть объявлен какRotationMatrix
. У AMatrix
нетUpdate
.2. Если вопрос «решен», то вы должны принять ответ, который его решил, не редактируйте свой вопрос, чтобы включить «решаемый».
3. @Михаил Долгополов стоит знать, что обработка обеспечивает
PMatrix2D
иPMatrix3D
преобразования координат, работающие в сочетании сPVector
Ответ №1:
Во-первых, вы, вероятно, объявили m
as Matrix
вместо as RotationMatrix
. Но Matrix
не имеет Update
метода, отсюда и ошибка. Вам нужно объявить тип m
as RotationMatrix
, чтобы исправить это.
Далее, поскольку вы не объявили Update
как public
, в настоящее время он является закрытым для пакетов. Если вы попытаетесь получить к нему доступ за пределами пакета, в котором RotationMatrix
был объявлен, вы получите ошибку, которую вы видите. Объявите метод как public
, чтобы исправить это.
(То же самое, вероятно, относится к большинству методов, объявленных в Matrix
.)
Комментарии:
1. Я четко написал, как я объявляю m: m=new rotationMatrix(3); m.Update();
2. @MikhailDolgopolov В Java для объявления требуется тип в левой части имени переменной; то, что вы опубликовали, не является объявлением, это присвоение. Какой режим обработки вы используете, который позволяет объявлять переменные без типа? Вы ввели это в REPL?
3. Спасибо! Я забыл изменить тип слева, вы правы. Вопрос решен.