У меня есть набор массивов (которые представляют собой «пиксели» - представление RGB), например.Смещение изображения влево и вправо
(0,0,0)(0,0,0)(0,0,0)(0,0,0)
(1,1,1)(1,1,1)(1,1,1)(1,1,1)
(2,2,2)(2,2,2)(2,2,2)(2,2,2)
Я хочу сдвинуть влево/вправо столбцы и вверх/вниз по строкам. например:
ShiftCol + 2 даст выход:
(0,0,0)(0,0,0)(0,0,0)(0,0,0)
(0,0,0)(0,0,0)(1,1,1)(1,1,1)
(0,0,0)(0,0,0)(2,2,2)(2,2,2)
ShiftRow - 1 даст выход: (после ShiftCol +2)
(0,0,0)(0,0,0)(0,0,0)(0,0,0)
(0,0,0)(0,0,0)(0,0,0)(0,0,0)
(0,0,0)(0,0,0)(1,1,1)(1,1,1)
(что случилось в приведенном выше выходе : Первая строка перемещается во вторую строку, вторую строку в третью строку, а первая строка становится черной (только нуль), третья строка просто заменяется второй строкой.
ShiftCol- 1 даст выход:
(0,0,0)(0,0,0)(0,0,0)(0,0,0)
(0,0,0)(0,0,0)(0,0,0)(0,0,0)
(0,0,0)(1,1,1)(1,1,1)(0,0,0)
Мне просто нужна ваша помощь, чтобы показать мне, как я могу «переместить» каждый столбец вправо, этого будет достаточно. То, что мне удалось сделать, - это когда вызывается ShiftCol +2, первый столбец перемещается на 2 столбца вправо (и появляется на третьем столбце), а первые два столбца превращаются в (0,0,0), который является черным цвет. проблема в том, что я не знаю, как перемещать КАЖДОЙ столбец вправо в соответствии с номером, который он вызывается для перемещения вправо, например - если я вызываю ShiftCol (2), а массив пиксельных изображений - 3x4, как вы можете видеть в выходы должны состоять в следующем: первый столбец будет перемещен дважды вправо - в третий столбец, а первый столбец станет черным (0,0,0), второй столбец будет перемещен в два раза вправо и станет четвертой колонке. третий и четвертый столбцы будут заменены только первым и вторым столбцами.
Этого будет достаточно, если вы просто как-нибудь научитесь управлять этим, так или иначе, вы можете сосредоточиться на методе «ShiftCol» только в классе RGBImage, и вы увидите, что я сделал до сих пор в коде. Спасибо, заранее!
* ПОЖАЛУЙСТА, держите ответ простым с кодом. Я узнал только для циклов, в то время как циклы, если заявления, массивы .. Я не хочу использовать в этом проекте какой-либо другой продвинутый материал.
Вот мой код:
RGBColor класс:
public class RGBColor {
/**
* attributes: red, green and blue component of a color.
*/
private int _red,_green,_blue;
/**
* final variables.
*/
private final int MAX_VALUE = 255,MIN_VALUE = 0;
private final double THIRTY_PERCENT = 0.3,FIFTY_NINE_PERCENT = 0.59,ELEVEN_PERCENT = 0.11;
/**
* Consctructor which gets 3 colors (RGB), we check here if their range is valid (0 - 255), if not we assign black to it.
*
* @param red - The red color component value.
* @param green - The green color component value.
* @param blue - The blue color component value
*/
public RGBColor(int red, int green, int blue)
{
if(isValid(red,green,blue))
{
_red = red;
_green = green;
_blue = blue;
}
else
doBlack();
}
/**
* Construct a black RGBColor. i.e. red = green = blue = 0
*/
public RGBColor()
{
doBlack();
}
/**
* Here we check if the color number was entered correctly.
* It has to be an integer (whole number) between 0-255.
*
* @param nums - a component value, should be the number between 1-4
* @param return - return true if the number is between 1-4, false otherwise.
*/
private boolean isValid(int nums)
{
return ((nums >= MIN_VALUE) && (nums <= MAX_VALUE));
}
/**
* Here we check if the color number was entered correctly.
* It has to be an integer (whole number) between 0-255.
*
* @param red - the red component
* @param green - the green component
* @param blue - the red component
* @param return true if values are correct, false otherwise.
*/
private boolean isValid(int red, int green, int blue)
{
return ((red <= MAX_VALUE && red >= MIN_VALUE &&
green <= MAX_VALUE && green >= MIN_VALUE &&
blue <= MAX_VALUE && blue >= MIN_VALUE));
}
/**
* Returns RGB color string triplet with numbers between 0-255, i.e. (0,127,127)
*/
public String toString()
{
return ("(" + _red + "," + _green + "," + _blue + ")");
}
/**
* RGBColor will become the color Black. (0,0,0)
*/
private void doBlack()
{
_red = _green = _blue = 0;
}
}
класс RGBImage:
public class RGBImage
{
private int _rows, _cols;
private RGBColor[][] _pixels;
private int _offset = 0;
public RGBImage(int rows, int cols)
{
_rows = rows;
_cols = cols;
_pixels = new RGBColor[_rows][_cols];
for(int i = 0; i < _rows; i++)
for(int j = 0; j < _cols; j++)
_pixels[i][j] = new RGBColor();
}
public RGBImage(RGBColor[][] pixels)
{
_rows = pixels.length;
_cols = pixels[0].length;
_pixels = new RGBColor[_rows][_cols];
for(int i = 0; i < _rows; i++)
for(int j = 0; j < _cols; j++)
_pixels[i][j] = new RGBColor(pixels[i][j]);
}
public void shiftCol (int offset)
{
if(_offset == 0)
_offset = offset;
else
_offset += offset;
int currentShift = 1;
if((_offset == _cols) || (-_offset == _cols)){
makeBlack(_rows,_cols); //make black
}
else if((_offset < _cols) || (-_offset < _cols))
{
if(_offset > 0){
for(int j = currentShift; j < _cols && j <= _offset; j++){
for(int i = 0; i < _rows; i++){
setPixel(i,j + 1,this._pixels[i][j]);
setPixel(i,j,this._pixels[i][j] = new RGBColor());
}
}
_offset++;
currentShift++;
}
else if(offset < 0){
offset = -offset;
for(int j = currentShift; j < _cols && j <= offset; j++){
for(int i = 0; i < _rows; i++){
setPixel(i,_cols - 1 - j,this._pixels[i][_cols - j]);
setPixel(i,_cols,this._pixels[i][_cols - j] = new RGBColor());
}
currentShift++;
}
}
}
}
public void setPixel(int row, int col, RGBColor pixel)
{
if ((pixel != null) && (row < _pixels.length) && (col < _pixels[0].length))
_pixels[row][col] = new RGBColor(pixel);
}
public String toString()
{
String pixelSet ="";
for (int i = 0; i < _rows; i++){
for(int j = 0; j < _cols; j++){
pixelSet += this._pixels[i][j].toString();
}
pixelSet += "\n";
}
//pixelSet += tester;
return pixelSet;
}
}
и мой выход тестер класс:
StudentTester класс:
класс StudentTester общественного {
public static void main(String[] args) {
System.out.println("Black Image Constructor:");
RGBImage rgbImg0 = new RGBImage(3,4);
System.out.println(rgbImg0);
System.out.println("Constructor with RGBColor[][] Array Parameter:");
RGBColor[][] rgbArray1 = new RGBColor[5][4];
for (int i=0; i<rgbArray1.length;i++)
for (int j=0; j<rgbArray1[0].length;j++)
rgbArray1[i][j] = new RGBColor(i,i,i);
RGBImage rgbImg1 = new RGBImage(rgbArray1);
System.out.println(rgbImg1);
System.out.println("Copy Constructor:");
RGBImage rgbImg2 = new RGBImage(rgbImg1);
System.out.println(rgbImg2);
System.out.println("flipVertical:");
rgbImg1.flipVertical();
System.out.println(rgbImg1);
System.out.println("rotateClockwise:");
rgbImg1.rotateClockwise();
System.out.println(rgbImg1);
System.out.println("shiftCol 2:");
rgbImg1.shiftCol(3);
System.out.println(rgbImg1);
System.out.println("shiftCol 2:");
rgbImg1.shiftCol(-2);
System.out.println(rgbImg1);
System.out.println("shiftCol 2:");
rgbImg1.shiftCol(1);
System.out.println(rgbImg1);
}
}
Это только предположение, потому что есть много кода, чтобы взять здесь. Но я думаю, что ваш цикл for - это только повторение суммы смещения, но это, вероятно, должно быть (смещение * _cols) – chancea
@chancea Ну, я пытаюсь как-то определить, КОТОРЫЕ столбцы не должны перемещаться, например, в ShiftCol +2 Не хочу, чтобы третий и четвертый двигались, я просто хотел, чтобы их заменили первые и второй столбцы. и если я переведу ShiftCol - 1, я хочу, чтобы только второй, третий и четвертый столбцы перемещались один влево. Я считаю, что я довольно близок к решению. Я посмотрю, что я могу сделать. также мне трудно понять, как справку * _cols помогут и где именно. –
Я думаю, что путаница - это слово «столбцы» против «_cols». Я думаю, что когда вы говорите «столбец», вы имеете в виду три столбца, из которых состоит набор (3 набора столбцов составляют 1 полный столбец). Я думаю, похоже, что в вашем коде вы перемещаете каждый столбец на следующую позицию в наборе, или ваш текущий код фактически переводит его на следующую (сумму смещения)? Извините, если я не чувствую смысла. – chancea