ফ্রিহ্যান্ড লাল বৃত্ত


19

উপর ওভার http://meta.stackoverflow.com , আমরা আমাদের নিজস্ব একটি কয়েক মেমে আছে। এর মধ্যে একটি হ'ল ফ্রিহ্যান্ড রেড সার্কেল।

এই পোস্টটি দেখুন :

সুতরাং, চ্যালেঞ্জটি হ'ল,

আপনি কোড সহ ফ্রিহ্যান্ড লাল বৃত্ত আঁকতে পারেন?

অতিরিক্ত বিধিনিষেধ:

  • আপনি ইনপুট হিসাবে কোনও চিত্র নেবেন এবং আপনাকে অবশ্যই ফ্রিহ্যান্ড রেড সার্কেল যুক্ত ছবিটি আউটপুট করতে হবে।
  • অবশ্যই পূর্বাভাসযোগ্য হতে হবে, অর্থাত একই চিত্রের ইনপুটটির ফলাফল একই আউটপুট হতে পারে। আপনি এলোমেলো ব্যবহার করতে পারেন, তবে ফলাফল একই ইনপুট জন্য সামঞ্জস্য হতে হবে।
  • আউটপুট অবশ্যই বৃত্ত (অন্য কোনও পরিবর্তন নয়) ব্যতীত ইনপুট হিসাবে ঠিক একই চিত্র হতে হবে।
  • ফ্রিহ্যান্ড লাল বৃত্ত অবশ্যই ফ্রিহ্যান্ড দেখতে হবে (নিখুঁত চেনাশোনাগুলি নেই!), লাল হতে হবে (স্পষ্টতই), এবং সাধারণত একটি বৃত্তের মতো দেখতে হবে (কোনও এলোমেলো স্কাগগ্লি রেখা নেই)।

এটি একটি , সুতরাং মার্চ ২০১৪ এর শুরুতে সর্বাধিক উন্নতির সাথে উত্তরটি জিতবে। "ফ্রিহ্যান্ড রেড সার্কেল" ব্যতীত কোনও সুনির্দিষ্ট লক্ষ্য নেই, তাই যতটা সম্ভব সৃজনশীল হোন যাতে আপনি সর্বাধিক উন্নতি পেতে পারেন! (যতটা সম্ভব নিরপেক্ষ হতে, আমি বিধি অনুসরণ করে যে কোনও উত্তরকে সমর্থন করব))


11
আমি মনে করি এটির আরও কিছুটা ব্যাখ্যা দরকার needs আমরা কি ক) সরল সাদা ক্যানভাসে একটি বৃত্ত ব্যতীত কিছুই আঁকতে পারি না, খ) পাঠ্যযুক্ত একটি চিত্র নিয়ে টেক্সট ব্লকের চারপাশে একটি বৃত্ত আঁকুন, বা গ) একটি পাঠ্য গ্রহণ করুন এবং একটি দিয়ে টেক্সটের একটি চিত্র তৈরি করুন চারদিকে বৃত্ত?
প্রিমো

3
+1 থেকে @ প্রিমো। এছাড়াও, অন্যান্য বিষয়গুলিও বিবেচনা করা উচিত: যদি আমাদের যা করা দরকার তা যদি একটি বৃত্ত আঁকতে হয় তবে প্রতিবারেই কি একই বৃত্তটি হয় বা প্রোগ্রামটি বিভিন্ন বৃত্ত আঁকতে সক্ষম হওয়ার প্রয়োজন হয় - এবং এই চেনাশোনাগুলি কেবল এলোমেলোভাবে আলাদা হওয়ার জন্য, বা কোনওভাবে ব্যবহারকারী ইনপুট দ্বারা নির্দিষ্ট? বৃত্তের আকার বা আকৃতি নির্ধারণ করার জন্য প্রোগ্রামটি কি আদৌ ব্যবহারকারীর ইনপুট পরিচালনা করতে সক্ষম হতে হবে? ইমেজ আউটপুটটি কোন ফর্ম্যাটে রয়েছে তা কী গুরুত্বপূর্ণ, বা কেউ কেবল কিছু চালাক ASCII শিল্প নিয়ে আসতে পারে?
ইসজি

2
আমি মনে করি উত্তরটি "এটি একটি জনপ্রিয়তার প্রতিযোগিতা, সুতরাং আপনার কোড-গল্ফ বন্ধুরা মুগ্ধ করুন"
ম্যাককে

আমি জানি না এই প্রশ্ন সম্পর্কে কি অস্পষ্ট। @ ইসজি - মূল শব্দটি হ্যান্ডহ্যান্ড। পেইন্ট বা জিআইএমপি খুলুন এবং কিছু ফ্রিহ্যান্ড সার্কেল আঁকুন, তারা কি সব একই দেখায়? বিবরণ এবং লিঙ্কটি থেকে দেখে মনে হচ্ছে আপনাকে এমন কোনও কিছুকে ঘিরে চেনাশোনা আঁকতে হবে যা এক্স ও ওয়াই এবং আকারকে বোঝায়। আপনি কোন ফাইল ফর্ম্যাটটি ব্যবহার করেন তাতে কী আসে যায়? আপনি যদি পিএনজি, জেপিইজি বা যা কিছু চান তবে কেবল একটি কনভার্টারের মাধ্যমে এটি চালান।

আমি ম্যাককে নিয়ে বিশ্বাস করি। আপনি যদি অনেকগুলি অগ্রাধিকার চান তবে এলোমেলোভাবে ফ্রিহ্যান্ড সার্কেল আঁকুন। অন্যথায়, আপনার চেনাশোনাটিকে হার্ডকোড করুন
হোশেচ 250

উত্তর:


13

সি - চেপে ধরলে প্রায় 750 720 বাইট *

আমি মনে করি আমি এমন কিছু নিয়ে এসেছি যা যথেষ্ট পরিমাণে হ্যান্ড-ওয়াই দেখাচ্ছে।

  • একটি এলোমেলো কোণে শুরু হয়
  • একটি পূর্ণ বৃত্ত প্লাস বা বিয়োগ কিছুটা আঁকুন
  • একটি ঘন স্কুইগ্লি লাইন ব্যবহার করে (সম্ভবত খুব স্কুইগলি!)
  • একটি MAGICনম্বর পরিবর্তন করে কাস্টমাইজযোগ্য

কম্পাইল:

gcc -o freehand freehand.c -lm

চালান:

./freehand [X center in % W] [Y center in % H] [radius in % diagonal] < [PPM file input] > [PPM file output]

উদাহরণ:

./freehand 28.2 74.5 3.5 < screenshot.ppm > freehand.ppm

আগে:

আগে

পরে:

পরে

কোড:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define MAGIC      42
#define UNIFORM(x) ((x) * (double)rand() / (double)RAND_MAX)

typedef struct {unsigned char r, g, b;} RGB;

int main(int argc, char **argv)
{
    int W, H, i, f, g, x, y;
    double X, Y, R, a, r;
    RGB *p;

    srand(MAGIC);

    if (argc != 4 || scanf("P6 %d %d 255\n", &W, &H) != 2)
        return 1;

    p = malloc(sizeof(RGB) * W * H);

    fread(p, sizeof(RGB), W * H, stdin);

    X = W * atof(argv[1]) / 100.0;
    Y = H * atof(argv[2]) / 100.0;
    R = hypot(W, H) * atof(argv[3]) / 100.0;

    for (a = UNIFORM(M_PI), i = 2.0 * M_PI * R + UNIFORM(R / 4.0), r = R; i > 0; i--, a += 1.0 / R)
    {
        r += UNIFORM(2.0) - 1.0;
        f = sin(a) * r + X;
        g = cos(a) * r + Y;

        for (x = f - 2; x <= f + 2; x++)
        {
            for (y = g - 2; y <= g + 2; y++)
            {
                if (x >= 0 && x < W && y >= 0 && y < H)
                {
                    RGB *s = p + y * W + x;
                    s->r = 255;
                    s->g = 0;
                    s->b = 0;
                }
            }
        }
    }

    printf("P6 %d %d 255\n", W, H);
    fwrite(p, sizeof(RGB), W * H, stdout);

    free(p);

    return 0;
}

* এবং এর Uজন্য UNIFORMএবং এর Mজন্য ব্যবহার করাMAGIC


25

সি + জিডি গ্রন্থাগার

যে কোনও পুরানো চেনাশোনাগুলি আঁকার পরিবর্তে আমি ভেবেছিলাম ছবিতে লাল কিছু খুঁজে পাওয়া এবং তার চারপাশে একটি বৃত্ত আঁকতে মজা হবে।

এখানে প্রাপ্ত ফলাফল কিছু উদাহরণ দেওয়া হল সঙ্গে একটি কয়েক ফটো থেকে উইকিমিডিয়া কমন্স :

চারদিকে চেনাশোনা সহ লাল জিনিস

এবং কোড এখানে। এটি কিছুটা অগোছালো, তবে অনুসরণ করা খুব কঠিন নয়, আমি আশা করি:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gd.h>

#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))

/* Used for image segmentation */
int floodfill(int *tmp, int i, int w, int id) {
  int np=1;
  tmp[i]=id;
  if (tmp[i-w-1]<0) np+=floodfill(tmp,i-w-1,w,id);
  if (tmp[i-w]<0) np+=floodfill(tmp,i-w,w,id);
  if (tmp[i-w+1]<0) np+=floodfill(tmp,i-w+1,w,id);
  if (tmp[i-1]<0) np+=floodfill(tmp,i-1,w,id);
  if (tmp[i+1]<0) np+=floodfill(tmp,i+1,w,id);
  if (tmp[i+w-1]<0) np+=floodfill(tmp,i+w-1,w,id);
  if (tmp[i+w]<0) np+=floodfill(tmp,i+w,w,id);
  if (tmp[i+w+1]<0) np+=floodfill(tmp,i+w+1,w,id);
  return np;
}

int main(int argv, char *argc[]) {
  FILE          *infile,*outfile;
  gdImagePtr    img;
  int           *t, *tmp;
  int           w,h,x,y,r,g,b;
  int           c,redness,rgb;
  int           i,np,max,min,thresh;
  int           xt,yt,n;
  int           areaID,size,maxID;
  double        xmin,ymin,xmax,ymax,rad,r0,th;
  gdPoint       v[33];


  /* Check command line and open source JPEG file */
  if (argv!=3) return printf("Usage: %s <in.jpg> <out.jpg>\n",argc[0]);
  if (!(infile=fopen(argc[1],"r"))) return printf("Can't open <%s>\n",argc[1]);
  if (!(img=gdImageCreateFromJpeg(infile))) return printf("Bad JPEG: <%s>\n",argc[1]);
  fclose(infile);

  /* Extract red pixels and auto-threshold */
  w=img->sx;
  h=img->sy;
  np=w*h;
  t=tmp=calloc(np,sizeof(int));
  for (max=0,min=255,y=1;y<h-1;y++) {
    for (x=1;x<w-1;x++) {
      rgb=gdImageGetTrueColorPixel(img,x,y);
      r = (rgb&0xff0000)>>16;
      g = (rgb&0xff00)>>8;
      b = rgb&0xff;
      redness = max(0,r-(max(g,b)+abs(g-b)));
      if (redness>max) max=redness;
      if (redness<min) min=redness;
      *t++ = redness;
    }
    t += 2;
  }
  thresh = (max+min)/2;
  for (t=tmp,i=0;i<np;i++,t++) *t=((*t>thresh)?-1:0);

  /* Label each area detected */
  areaID=1;
  maxID=0;
  max=-1;
  for (t=tmp,i=0;i<np;i++,t++) {
    if (*t<0) {
      size=floodfill(tmp,i,w,areaID);
      if (size>max) {
        max = size;
        maxID = areaID;
      }
      areaID++;
    }
  }

  /* Calculate centre coordinates and area */
  if (max>0) {
    xt=yt=n=xmax=ymax=0;
    xmin=w; ymin=h;
    for (t=tmp,y=0;y<h;y++) {
      for (x=0;x<w;x++) {
        if (*t++==maxID) {
          xt+=x;
          yt+=y;
          n++;
          if (x<xmin) xmin=x;
          if (y<ymin) ymin=y;
          if (x>xmax) xmax=x;
          if (y>ymax) ymax=y;
        }
      }
    }
    x = xt/(2*n) + (xmax+xmin)/4;
    y = yt/(2*n) + (ymax+ymin)/4;

    r0 = max(20,min(min(w,h),max(xmax-xmin,ymax-ymin))/2);
  }
  /* Default circle if nothing found */
  else {
    x=w/2; y=h/2; r0=min(w,h)/3;
  }

  /* Draw a red circle */
  for (th=4.0,i=0;i<33;i++) {
    rad = r0 * (1.2 + (" ,<MYZVSB>@EJIOSWZfgb^bbfgeZTOI@2"[i]-87)/160.0);
    v[i].x = x + rad * sin(th);
    v[i].y = y + rad * cos(th);
    th += 0.22;
  }
  gdImageSetThickness(img,7);
  c = gdImageColorAllocate(img,255,0,0);
  gdImageOpenPolygon(img,v,33,c);

  /* Output results to file */
  printf("Saving...\n");
  if (!(outfile=fopen(argc[2],"w"))) {
    return printf("Can't open <%s> for writing\n",argc[2]);
  }
  gdImageJpeg(img,outfile,85);
  fclose(outfile);
  gdImageDestroy(img);
  printf("Finished\n");
  return 0;
}

দ্রষ্টব্য: মার্কডাউন মন্তব্যগুলিতে আমার লিঙ্কটি বিশৃঙ্খলা করেছে, সুতরাং আমি কেবল উল্লেখ করব যে কোডটি ছবিতে লাল সমস্ত অঞ্চল চিহ্নিত করতে বিভাগকে ব্যবহার করে এবং এরপরে এর বৃহত্তমটির চারদিকে একটি বৃত্ত আঁকবে। উদাহরণস্বরূপ, এই চিত্র :

লাল বালতি এবং একটি সৈকতে কোদাল

নিম্নলিখিত আউটপুট উত্পাদন করে:

লাল বালতিটির চারপাশে একটি বৃত্ত রয়েছে, কারণ এটি কোদালের চেয়ে বড়


1
সুন্দর কাজ! ;) কোনও কিছুর উপর জোর দেওয়ার জন্য এগুলি আঁকার থিমটি নিয়ে আরও যান। তবে আমি আগ্রহী যে দুটি লাল জিনিস থাকলে এটি কী করবে ...? (+1)
ডোরকনবব

2
এটি সমস্ত লাল অঞ্চলকে বিভিন্ন বিভাগে রূপান্তর করে এবং বৃহত্তমটি চয়ন করে। সুতরাং উদাহরণস্বরূপ একটি লাল বালতি এবং কোদালীর এই ফটোতে বালতিটি জিতেছে। এখানে ফলাফল এর
খুঁতখুঁতে ossifrage

10

ম্যাথামেটিকাল

ClearAll[f]
f[image_,rad_, xPos_:.5,yPos_:.5,color_:Darker[Red,0.3],thick_:.01,axes_:False]:=
 Module[{i=ImageDimensions[image],rr,y=SeedRandom[2]},
 rr:=RandomReal[{-.1,.1}];
 Show[image,Graphics[{color,JoinForm["Round"],CapForm["Round"],Thickness[thick],
 Line[t=Table[{rad i[[2]] (Cos[z]+rr)+i[[1]]xPos,rad i[[2]] (Sin[z]+rr)+i[[2]] yPos},
 {z,0, 2 Pi+2Pi/12,Pi/12}]]}],Axes-> axes]]

f নিম্নলিখিত পরামিতি গ্রহণ করে:

  • চিত্র: চিত্রটি একটি বৃত্তের সাথে চিহ্নিত করা হবে
  • রেড: চিত্রের প্রস্থের ভগ্নাংশে বৃত্তের ব্যাসার্ধ
  • xPos: 0 থেকে 1 (ডিফল্ট = .5) এর সাথে x বরাবর বৃত্তের কেন্দ্রের অবস্থান
  • yPos: 0 থেকে 1 (ডিফল্ট = .5) পর্যন্ত y এর সাথে বৃত্তের কেন্দ্রের অবস্থান
  • রঙ: কালি রঙ (ডিফল্ট = গা dark় লাল)
  • বেধ: স্ট্রোক বেধ (ডিফল্ট = .01)
  • অক্ষ: অক্ষটি প্রদর্শন করতে হবে (ডিফল্ট = মিথ্যা)

উদাহরণ

text = Import["text.png"]
f[text,.13,.58,.23]

pic1

একটি ভিন্ন ব্যাসার্ধ, অবস্থান, নীল রঙ, ঘন স্ট্রোক, অক্ষ অক্ষর প্রদর্শন করা।

f[text,.22,.7,.5,Blue,.015,True]

pic2


বাহ, খুব সুন্দর! যদিও এটি এলোমেলো? (এটি অবশ্যই একই ইনপুটটির জন্য একই আউটপুট উত্পাদন করতে পারে))
ডুরকনব

আমি একটি সত্য চেনাশোনা থেকে বিচ্যুতির জন্য এলোমেলো ব্যবহার করেছি। আমি ভেবেছিলাম ঠিক আছে। যদি না হয়, আমি আকারটি শক্ত করে তুলতে পারি।
ডেভিডসি

"অবশ্যই অনুমানযোগ্য হতে হবে, অর্থাত একই চিত্রের ইনপুটটির ফলাফল একই আউটপুট হতে পারে You গাণিতিকায় একটি বীজযুক্ত আরএনজি পাওয়ার কিছু উপায় থাকতে হবে, তাই না?
ডুরকনব

হ্যাঁ, SeedRandomকৌশলটি মনে হচ্ছে।
ডেভিডসি

ঠিক আছে, দুর্দান্ত! +1
ডোরকনবব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.