Неверно утверждение о том, что код на ассемблере работает быстрее всего. Точнее сказать верно только при одновременном соблюдении условий: конкретный процессор, конкретный разработчик, умеющий оптимизировать код под этот процессор. В среднем компилятор лучше знает о всевозможных оптимизациях.
ocument.getElementById('voter').addEventListener('change'
- навешивает на некий элемент с id="voter" функцию, которая будет вызвана если в элементе произошли изменения (например когда в поле ввода текста введен новый текст)нода = чат, пхп = блогтолько лишь потому, что на ноде до сих пор не написан нормальный блогодвижек, что в свою очередь лишь потому, что таких движков, вылизанных временем, с кучей возможностей уже немало написано на php. То есть, если все таки взять и написать качественный блог на node.js он будет ничем не хуже чем написанный на php, просто чтобы это сделать понадобится немало времени и усилий, за которые никто дополнительно денег не даст:)
// array[][] - полотно на котором рисуем
// (далее все функции переделаны под grayscale вариант)
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
using namespace std;
// функция рисования линии
void WuLine(int** array, int x0, int y0, int x1, int y1)
{
var steep = Math.Abs(y1 - y0) > Math.Abs(x1 - x0);
if (steep)
{
Swap(ref x0, ref y0);
Swap(ref x1, ref y1);
}
if (x0 > x1)
{
Swap(ref x0, ref x1);
Swap(ref y0, ref y1);
}
DrawDarkPoint(steep, x0, y0, 1);
DrawDarkPoint(steep, x1, y1, 1);
float dx = x1 - x0;
float dy = y1 - y0;
float gradient = dy / dx;
float y = y0 + gradient;
for (var x = x0 + 1; x <= x1 - 1; x++)
{
DrawDarkPoint(steep, x, (int)y, 1 - (y - (int)y));
DrawDarkPoint(steep, x, (int)y + 1, y - (int)y);
y += gradient;
}
}
// функция рисования "черной" точки
void DrawDarkPoint(bool steep, int x, int y, float c)
{
if (!steep)
{
var color = GetPixel(x, y);
color *= (1 - c);
SetPixel(x, y, color);
}
else
{
var color = GetPixel(y, x);
color *= (1 - c);
SetPixel(y, x, color);
}
}
// считываем значение цвета точки с полотна в координатах x,y
int GetPixel(int x, int y){
// настоятельно рекомендую вставить проверку на выход за границы полотна
return array[x][y];
}
// рисуем точку на полотне в координатах x,y цветос c (число от 0 до 255)
void SetPixel(int x, int y, int c){
// настоятельно рекомендую вставить проверку на выход за границы полотна
array[x][y] = c;
}
// далее почти без изменений Ваш код
int main(void)
{
ofstream fout;
fout.open("E:\\line.pgm");
fout.write("", 0);
fout « "P2" « "\n" ;
int numcols, numrows, x1, x2, y1, y2;
cout « "Enter rows and columns number: ";
cin » numrows » numcols;
cout « "Enter coords x1 and y1: ";
cin » x1 » y1;
cout « "Enter coords x2 and y2: ";
cin » x2 » y2;
fout « numrows « " " « numcols « "\n";
fout « 255 « "\n";
int** array = new int*[numrows];
for (int count = 0; count < numrows; count++)
array[count] = new int[numcols];
for (int i = 0; i < numrows; ++i) {
for (int j = 0; j < numcols; ++j) {
array[i][j] = 255;
}
}
WuLine(array, x1, y1, x2, y2);
for (int i = 0; i < numrows; ++i) {
for (int j = 0; j < numcols; ++j) {
fout « array[i][j] « " ";
}
}
fout.close();
}
// подключаем библиотеку работы с файлами
const fs = require('fs');
// создаем сласс Canvas
function Canvas(width,height){
this.width = width;
this.height = height;
this.sheet = [];
for(let y=0; y<height; y++){
this.sheet[y]=[];
for(let x=0; x<width; x++){
this.sheet[y][x]=255;
}
}
};
// Метод рисования линии
Canvas.prototype.WuLine = function(x0, y0, x1, y1) {
const steep = Math.abs(y1 - y0) > Math.abs(x1 - x0);
if (steep) {
var swap;
swap = x0; x0 = y0; y0 = swap;
swap = x1; x1 = y1; y1 = swap;
}
if (x0 > x1) {
var swap;
swap = x0; x0 = x1; x1 = swap;
swap = y0; y0 = y1; y1 = swap;
}
this.DrawDarkPoint(steep, x0, y0, 1);
this.DrawDarkPoint(steep, x1, y1, 1);
const dx = x1 - x0;
const dy = y1 - y0;
const gradient = dy / dx;
let y = y0 + gradient;
for (var x = x0 + 1; x <= x1 - 1; x++)
{
this.DrawDarkPoint(steep, x, y, 1 - (y - Math.floor(y) ) );
this.DrawDarkPoint(steep, x, y + 1, y - Math.floor(y) );
y += gradient;
}
};
// метод рисования "черной" точки
Canvas.prototype.DrawDarkPoint = function(steep, x, y, c) {
const xx = Math.floor(x);
const yy = Math.floor(y);
if (!steep) {
var color = this.GetPixel(xx, yy);
color *= (1 - c);
this.SetPixel(xx, yy, color);
} else {
var color = this.GetPixel(yy, xx);
color *= (1 - c);
this.SetPixel(yy, xx, color);
}
};
// метод получает значение цвета точки с полотна в координатах x,y
Canvas.prototype.GetPixel = function(x, y) {
return this.sheet[y][x];
};
// метод устанавливает значение с в точку на полотне в координатах x,y
Canvas.prototype.SetPixel = function(x, y, c) {
c = Math.floor(c);
if(x<0 && x>=this.width) return;
if(y<0 && y>=this.height) return;
this.sheet[y][x] = c;
};
// метод сохраняет картинку в файл в формате PPM
Canvas.prototype.savePPM = function(fname) {
const fd = fs.openSync(fname, 'a');
fs.writeSync(fd, "P3\n");
fs.writeSync(fd, "# P3 обозначает, что цвета даны в ASCII,\n");
fs.writeSync(fd, "# затем идут цифры, обозначающие число колонок и рядов\n");
fs.writeSync(fd, "# 255 для максимального значения цвета\n");
fs.writeSync(fd, "# затем триплеты RGB\n");
fs.writeSync(fd, this.width + " " + this.height + "\n");
fs.writeSync(fd, "255\n");
this.sheet.forEach(a=>{
a.forEach(c=>{
fs.writeSync(fd, c + " " + c + " " + c + "\n");
});
});
};
var canvas = new Canvas(400,400);
for(let i=0; i<360; i+=10 ){
const x = 200+Math.round(Math.cos(Math.PI*i/180)*190 );
const y = 200+Math.round(Math.sin(Math.PI*i/180)*190 );
canvas.WuLine(200, 200, x, y);
}
canvas.savePPM("test.ppm");
/**
* готовим исходные данные (рандомно:)
*/
// искомая сумма, генерируем случайное целое число в диапазоне от 0 до 100.
var S = Math.floor(Math.random()*50);
// массив в котором хранится подмножество
var N = [];
// заполняем его случайными целыми числами в диапазоне от -s до +s
for( var i=0; i<30; i++){
N[i] = Math.floor(Math.random()*S*2)-S;
}
/**
* перебираем (в случае большого числа элементов в N может быть критично по памяти :)
*/
// начинаем поиск (алелуя :)
console.log("искомая сумма: ("+S+")");
console.log("множество значений:\n("+N.join(", ")+")\n");
searchSubN(S, N, [])
// рекурсивная функция (производит полный перебор всех вариантов)
function searchSubN(S, N, sub) {
// начинаем перебор
N.forEach((c,i)=>{
// клонируем массив решений
var cloneSub = sub.slice();
if(c===S){
// найдено очередное решение
cloneSub.push(c);
// выводим сообщение
console.log("найдено решение: summ("+cloneSub.join(", ")+") = "+cloneSub.reduce( (a,c)=>{return a+c;} ) );
}else if(c<S){
// возможно это станет решением
cloneSub.push(c);
// делаем клон массива
var clone = N.slice();
// удаляем из клона текущий элемент
clone.splice(i,1);
// ищем следи оставшихся подмножество равное S-c
searchSubN(S-c, clone, cloneSub);
}
});
}
~/share/programming/work/test> node search.sub.01.js
искомая сумма: (14)
множество значений:
(11, 8, -5, 9, -8, -6, 2, 4, 12, -11, -2, -4, 6, -10, -1, -7, -13, -10, 9, -7, 2, -3, 5, 0, -13, 7, -11, -8, 10, -12)
найдено решение: summ(11, -5, 8) = 14
найдено решение: summ(11, -5, -8, 8, -6, 9, 2, -11, 4, -2, 12) = 14
PS: не тестировал.